Showing posts with label Solution Architecture. Show all posts
Showing posts with label Solution Architecture. Show all posts

Top Web Development Frameworks 2018-2020

Top Web Development Frameworks 2018-2020

Based on data from HotFrameworks, which tracks framework popularity based on GitHub as well as StackOverflow ranking, we are able to predict the popular frameworks to 2020.
FrameworkBest For
ASP.NETApps using the Microsoft stack and C# as the development language
AngularJSJavaScript apps using Google’s improvements to HTML via extensible templating
Ruby On RailsRuby-based applications that leverage convention over configuration for fast development
ASP.NET MVCApps that need the Microsoft stack along with convention driven MVC architecture
ReactFront-end apps built with component-based architecture
DjangoPython apps that need to scale based on well-structured foundations
AngularSoftware applications that need a full-featured front end
LaravelPHP apps that need the structure of a modern MVC framework
SpringJava framework that lets you build apps on the Java virtual machine
ExpressReal-time and data-intensive apps that need the scalability benefits of Node.js
In the table above, we list the highly popular frameworks that are likely to be in highest demand based on their rankings in the preceding years. You can expect that developers specializing in these skills will be highly demanded by businesses.

Solution Architecture vs. Software Architecture

Solution Architecture

The term "solution architecture" is used to describe the process of developing, documenting, and reviewing with relevant stakeholders a multi-dimensional architecture construct that enables a specific business or operational outcome. The target architecture that enables this outcome is defined within the context of all impacted and applicable architecture domains such as business, data, application, technology, integration, security, etc. A solution architecture document will elaborate and further decompose the target architecture into architecture deliverables for each architecture domain. For example, the solution architecture for a loan application digital channel at a fictional bank to allow bank’s customers to apply for a loan online will require an impact assessment of each architecture domain. Each domain will address the needs and concerns of the impacted stakeholders who are bound by that domain such as business, technology, operational, risk, legal, etc…
Image title
Let’s try to segregate some of these concerns into specific architecture domains:
  • Business Architecture: How does a customer apply for a loan online?
  • Data Architecture: What information is needed to enable loan risk assessment and processing? How to manage customer info with maximum security, integrity and optimal cost, performance, reliability, consistency?
  • Application Architecture: What UX, process management, and functional system components/services are needed to enable customer loan application via mobile and web devices?
  • Integration Architecture: How will the distributed application component and services talk to each other?
  • Security Architecture: How to properly verify and authenticate customer identity? How to ensure that customer data is secure in a distributed environment? How to prevent unauthorized data access and data theft over the wire?
  • Technology Architecture: How to configure supporting infrastructure for high availability and recoverability in case of system or facility failure?
  • DevOps Architecture: How to enable rapid product delivery and continuous maintenance?
The solution architecture that best addresses these concerns will be derived by applying a formal architecture development process and incorporating established organization’s architecture principles and reference architecture in order to define the most optimal technology solution that delivers the desired business outcome. The solution architecture must be well documented and presented to the project and architecture review boards to ensure that it satisfies the project constraints and technology standards established by the enterprise/chief architect.
The figure above is a sample of a few common solution architecture diagrams for a loan application use case. Please note that the actual solution architecture document will also contain a detail description of each domain target architecture and gaps. Other architecture artifacts such as catalogs and matrices may be used.

Software Architecture

Once the solution architecture is defined, reviewed, and approved, software architecture can now be developed as part of the Design or Architectural Runway SDLC phase. The primary focus of software architecture is to define and document software structure and behavior in order to enable software engineering and delivery based on known functional and non-functional requirements. This is quite different from the goal of solution architecture, which is to define app, data, infra architecture building blocks, dependencies, and address all relevant stakeholders’ concerns. Software architect, usually also a technology SME, will use architecture styles, object oriented analysis and software design patterns to design client and server side software components that implement the web/mobile customer experience (CX), process management, functional and data management application architecture blocks defined in the solution architecture document. As I mentioned, the focus of software architecture is to enable application development and delivery. The software engineering diagrams that I found most useful in my days as a software architect are the domain object model class, service component, sequence, and deployment diagrams.
Image title
  • Domain Object Model Class Diagram is essential in defining a consistent data format for information management, persistence, and sharing.
  • Services Component Diagram breaks down system functional services into self-contained API components that can be implemented as microservices
  • Sequence Diagram demonstrates how software modules and distributed components integrate with one another in a context of each use case.
  • Deployment Diagram is necessary to demonstrate software deployment on compute and middleware infrastructure in order to engineer a DevOps pipeline, manage software/infrastructure dependencies, and design for performance and failure

Cloud Native Application Architecture












Introduction

Cloud native is an approach for building applications as micro-services and running them on a containerised and dynamically orchestrated platforms that fully exploits the advantages of the cloud computing model. Cloud-native is about how applications are created and deployed, not where. Such technologies empower organisations to build and run scalable applications in modern, dynamic environments such as public, private, and hybrid clouds. These applications are built from the ground up, designed as loosely coupled systems, optimised for cloud scale and performance, use managed services and take advantage of continuous delivery to achieve reliability and faster time to market. The overall objective is to improve speed, scalability and, finally, margin.
Speed — Companies of all sizes now see a strategic advantage in being able to move quickly and get ideas to market fast. By this, we mean moving from months to get an idea into production to days or even hours. Part of achieving this is a cultural shift within a business, transitioning from big bang projects to more incremental improvements. At its heart, a Cloud Native strategy is about handling technical risk. In the past, our standard approach to avoiding danger was to move slowly and carefully. The Cloud Native approach is about moving quickly by taking small, reversible and low-risk steps.
Scalability — As businesses grow, it becomes strategically necessary to support more users, in more locations, with a broader range of devices, while maintaining responsiveness, managing costs and not falling over
Margin — In the new world of cloud infrastructure, the strategic goal is to be to pay for additional resources only as needed — as new customers come online. Spending moves from up-front CAPEX (buying new machines in anticipation of success) to OPEX (paying for additional servers on-demand).

Role Of CNCF

Cloud Native Computing Foundation is an open source software foundation housed in the Linux Foundation and includes big names such as Google, IBM, Intel, Box, Cisco, and VMware etc, dedicated to making cloud-native computing universal and sustainable. Cloud native computing uses an open source software stack to deploy applications as microservices, packaging each part into its own container, and dynamically orchestrating those containers to optimize resource utilisation. According to the FAQ on why CNCF is needed — Companies are realising that they need to be a software company, even if they are not in the software business. For example, Airbnb is revolutionising the hospitality industry and more traditional hotels are struggling to compete. Cloud native allows IT and software to move faster. Adopting cloud-native technologies and practices enables companies to create software in-house, allows business people to closely partner with IT people, keep up with competitors and deliver better services to their customers.

Cloud Native Design Principles

Designed As Loosely Coupled Microservices

Microservice is an approach to develop a single application as a suite of small services, each running in their own process and communicating using lightweight protocols like HTTP. These services are built around business capabilities and are independently deployable by fully automated deployment machinery.

Developed With Best-of-breed Languages And Frameworks

Each service of a cloud-native application is developed using the language and framework best suited for the functionality. Cloud-native applications are polyglot. Services use a variety of languages, runtimes and frameworks. For example, developers may build a real-time streaming service based on WebSockets, developed in Node.js, while choosing Python for building a machine learning based service and choosing spring-boot for exposing the REST APIs. The fine-grained approach to developing microservices lets them choose the best language and framework for a specific job.

Centred Around APIs For Interaction And Collaboration

Cloud-native services use lightweight APIs that are based on protocols such as representational state transfer (REST) to expose their functionality. Internal services communicate with each other using binary protocols like Thrift, Protobuff, GRPC etc for better performance

Stateless And Massively Scalable

A cloud-native app stores its state in a database or some other external entity so instances can come and go. Any instance can process a request. They are not tied to the underlying infrastructure which allows the app to run in a highly distributed manner and still maintain its state independent of the elastic nature of the underlying infrastructure. From a scalability perspective, the architecture is as simple as just by adding commodity server nodes to the cluster, it should be possible to scale the application

Resiliency At The Core Of the Architecture

According to Murphy’s law — “Anything that can fail will fail”. When we apply this to software systems, In a distributed system, failures will happen. Hardware can fail. The network can have transient failures. Rarely, an entire service or region may experience a disruption, but even those must be planned for. Resiliency is the ability of a system to recover from failures and continue to function. It’s not about avoiding failures, but responding to failures in a way that avoids downtime or data loss. The goal of resiliency is to return the application to a fully functioning state following a failure. Resiliency offers the following:
  • High Availability — the ability of the application to continue running in a healthy state, without significant downtime
  • Disaster Recovery — the ability of the application to recover from rare but major incidents: non-transient, wide-scale failures, such as service disruption that affects an entire region
One of the main ways to make an application resilient is through redundancy. HA and DR are implemented using multi node clusters, Multi region deployments, data replication, no single point of failure, continuous monitoring etc.
Following are some of the strategies for implementing resiliency:
  • Retry transient failures — Transient failures can be caused by momentary loss of network connectivity, a dropped database connection, or a timeout when a service is busy. Often, a transient failure can be resolved simply by retrying the request
  • Load balance across instances — Implement cluster everywhere. Stateless applications should be able to scale by adding more nodes to the cluster
  • Degrade gracefully — If a service fails and there is no failover path, the application may be able to degrade gracefully while still providing an acceptable user experience
  • Throttle high-volume tenants/users — Sometimes a small number of users create excessive load. That can have an impact on other users, reducing the overall availability of your application
  • Use a circuit breaker — The circuit breaker pattern can prevent an application from repeatedly trying an operation that is likely to fail. The circuit breaker wraps calls to a service and tracks the number of recent failures. If the failure count exceeds a threshold, the circuit breaker starts returning an error code without calling the service
  • Apply compensating transactions. A compensating transaction is a transaction that undoes the effects of another completed transaction. In a distributed system, it can be very difficult to achieve strong transactional consistency. Compensating transactions are a way to achieve consistency by using a series of smaller, individual transactions that can be undone at each step.
Testing for resiliency — Normally resiliency testing cannot be done the same way that you test application functionality (by running unit tests, integration tests and so on). Instead, you must test how the end-to-end workload performs under failure conditions which only occur intermittently. For example: inject failures by crashing processes, expired certificates, make dependent services unavailable etc. Frameworks like chaos monkey can be used for such chaos testing.

Packaged As Lightweight Containers And Orchestrated

Containers make it possible to isolate applications into small, lightweight execution environments that share the operating system kernel. Typically measured in megabytes, containers use far fewer resources than virtual machines and start up almost immediately. Docker has become the standard for container technology. The biggest advantage they offer is portability.
Cloud-native applications are deployed using Kubernetes which is an open source platform designed for automating deployment, scaling, and management of containerised applications. Originally developed at Google, Kubernetes has become the operating system for deploying cloud-native applications. It is also one of the first few projects to get graduated at CNCF.

Agile DevOps & Automation Using CI/CD

DevOps, the amalgamation of “development” and “operations describes the organisational structure, practices, and culture needed to enable rapid agile development and scalable, reliable operations. DevOps is about the culture, collaborative practices, and automation that aligns development and operations teams so they have a single mindset on improving customer experiences, responding faster to business needs, and ensuring that innovation is balanced with security and operational needs. Modern organisations believe in merging of development and operational people and responsibilities so that one DevOps team carries both responsibilities. In that way you just have one team who takes the responsibility of development, deployment and running the software in production.
Continuous Integration & Continuous Delivery
Continuous integration (CI) and continuous delivery (CD) is a set of operating principles that enable application development teams to deliver code changes more frequently and reliably. The technical goal of CI is to establish a consistent and automated way to build, package, and test applications. With consistency in the integration process in place, teams are more likely to commit code changes more frequently, which leads to better collaboration and software quality.
Continuous delivery picks up where continuous integration ends. CD automates the delivery of applications to selected infrastructure environments. It picks up the package built by CI, deploys into multiple environments like Dev, QA, Performance, Staging runs various tests like integration tests, performance tests etc and finally deploys into production. Continuous delivery normally has few manual steps in the pipeline whereas continuous deployment is a fully automated pipeline which automates the complete process from code checkin to production deployment.

Elastic — Dynamic scale-up/down

Cloud-native apps take advantage of the elasticity of the cloud by using increased resources during a use spike. If your cloud-based e-commerce app experiences a spike in use, you can have it set to use extra compute resources until the spike subsides and then turn off those resources. A cloud-native app can adjust to the increased resources and scale as needed.

Top trend in healthcare tech in 2019.

Shift Happens — Moving from Being a Healthcare Provider to Creating a Platform for Health and Healthcare in Your Community

Folks in tech would think of this as the difference between a "product" strategy (old school) and a "platform" strategy (new school). Think of this as the difference from cell phones (Blackberry) to smartphones (iPhone and Android devices). One was a product, the other was a platform. Common platforms that we're all familiar with such as Facebook, Amazon, Google, Apple and even Starbucks have always
1) started with a very small niche,
2) built an audience,
3) built trust and
4) then added other offerings on top of that platform.

By now there is no need for a "spoiler alert." We all know that this strategy works and these companies have created a breathtaking amount of value. The comforting news for hospitals and healthcare delivery systems is that many have already completed the first three steps and have many of the building blocks they need to leverage a "platform" as a business strategy.

System Design Cheat Sheet

It can be used for interviews or assessments, pre-sales or estimations.

1. Understand Problem and Scope

  • Recognize stakeholders and prioritize them. Create RACI matrix
  • Understand business drivers of the project
  • Recognize end-users of the project and understand how they will use that system
  • Check functional requirements
  • Define external dependencies
  • Suggest additional features
  • Remove items that interviewer considers out of scope

2. Think about constraints and non-functional requirements

  • (use PASS ME if you do not remember all of NFRs)
  • Recognize number of users
  • Estimate users growth rate (for the next year/next 5 years)
  • Define average response time
  • Understand database size (current / for the next year/ for the next 5 years)
  • Understand storage size (current / for the next year/ for the next 5 years)
  • Recognize security needs
  • Define acceptable downtime of the system
  • Recognize number of requests (per month/per second)
  • Estimate reads vs. writes operations percentage
  • Define time to market
  • Check customer related NFR: legacy/proprietary soft, etc

3. Detect Architecture Significant Requirements

4. Abstract Design

  • Choose which architectural views to define based on the stakeholders matrix. Use common C4/4+1/etc otherwise
  • Choose Architecture Style (Monolith, SOA — microservices, layered architecture, etc)
  • Choose between cloud solution or on-premise servers
  • Consider authentication/authorization and privacy
  • Suggest security rules and protocols
  • Define infrastructure: load balancing, messaging
  • Make rough overview of any key algorithm that drives the service
  • Consider bottlenecks and determine solutions
  • Choose storage type (SQL or NoSQL)
  • Understand what data should be cached and how to improve performance/security/availability with caching
  • Choose monitoring system and logging. Analytics and automatically reboot system in case of exceptions
  • Define separation between public and restricted areas

Vào XXX làm đi Bi, nhiều thứ hay ho mà?


Bi (con gái, sinh năm 1989, em của Kevin, đang làm cho công ty NTT Data tại Nhật): Hihi Bi cung thấy FPT hay
Nhưng mà Bi ko biết có những position gì ở trong đấy Bi thích hợp nhỉ. Cơ bản Bi thấy Bi không giỏi coding hay chuyên về kỹ thuật vì mấy năm nay ở NTT Data Bi ko làm cái đó. Bi chả biết 業務 mấy hehe, tuy nhiên Bi đọc 仕様書 thì nhanh. Mấy cái skills mềm như tiếng Anh, tiếng Nhật, presentation có logic hay đi thả thính thì Bi ok là mình làm đc, hoặc những việc làm cái mới thì ok, còn 定型作業 Bi ko thích.
Bi cũng thấy cty Bi chỉ cần một chú proper super BA (スーパー有識者) thôi chuyên về business chịu trách nhiệm một system 50 triệu usd, chuyên đi contact và lắng nghe khách hàng, chú cũng cực nắm system mọi chân tơ kẽ tóc nên được khách tin tưởng vô đối. Để thành super 有識者 cũng phải mất 10 năm hơn nắm nghiệp vụ của KH đó. Hiểu thứ khách hàng làm còn hơn là khách hàng nữa.
Một system mà chỉ cần 1 nhân viên NTT Data nắm nghiệp vụ, chừng 3 thằng infra cũng là NTT Data, còn lại là thuê ngoài hết, mà system $50M (bao gồm application lúc đầu và 5 năm bảo hành apps) thì Bi thấy hiệu suất trên đầu người cao ghê. Bi thấy đi theo hướng vertical như vậy là cực cần thiết thay vì offshore một đống người hàng ngang.
Để làm như vậy Bi thấy cty Bi thường hay pick up ra một anh sáng tài, cho anh ấy nắm nghiệp vụ của khách hàng hai ba năm, xong nuôi nó vài năm nữa gọi là super BA, tạo tin tưởng với khách hàng, sau nay họ ho cái gì là chạy lại gãi ngứa, gãi quen khách hàng cũng thích chỉ chọn mình.
Và do mình quá nắm nghiệp vụ như chân tơ kẽ tóc rồi nên khi mình viết 調達仕様書 cho những lần 業務改善 sau mình sẽ toàn viết những 調達事項 mà chỉ mình làm được, không thằng nào làm nổi do không quen, thế là KH cũng chỉ có thể chọn mình ko chọn ai, bài cty Bi cũng đơn giản chỉ có nhiêu đó.
Và đặc biệt là cty Bi đãi ngộ khá tốt so với các cty Nhật khác nên người vào ko hay bỏ ra làm cty khác, 1-5 năm đầu chỉ 育成 đến tầm năm thứ 6 tức giai đoạn của các anh 30t đến 40t thì cực giỏi, các sếp bukachou có 1 dàn cái tầm ba mươi mấy cực kì được việc nên phó mặc hết cho họ, bukachou chả làm gì cả, chỉ ăn rồi đi xin lỗi nếu xảy ra hoạ, tầm 40 là chả thấy development nữa, chỉ ngồi tính tiền thôi, trẻ khoẻ tầm 35 là cho làm bán sống bán chết.
Mấy cái kĩ thuật khó thì toàn nhờ vendor ngoài kentou xong đi troll mấy cty đó thôi à. Còn lại nhân viên NTT Data cho vào học nghiệp vụ và quản lý + lắng nghe khách hàng hết (hội delivery đó). Riêng hội infra tức là hội về kỹ thuật network thì giỏi IT thật.
Khi Bi đi làm với cty VN Bi thấy đa phần toàn thích code thay vì thích tìm hiểu sâu về nghiệp vụ để lần sau sáng chế ra thêm function mới. Thích nghe phía trên chỉ đâu làm đấy thay vì từng cá nhân tự create ra giá trị mới. Và ít thích tương tác tiếng Nhật (chắc do cty NTT Data ở Vietnam còn hạn chế tiếng Nhật và nhân viên còn non). Người VN có thế mạnh là thích ứng nhanh, không bị gò bó bởi những định kiến rườm rà tủn mủn của người Nhật, còn ngược lại người Nhật thì kĩ quá mức, cẩn thận như bà cụ già nên làm ra thành quả ít sai. Bi muốn chiết xuất được cả hai mặt tốt của cả hai bên để áp dụng vào công việc tương lai của mình.
Nói về khoản kỹ của Nhật, thằng senpai của Bi in tài liệu nó đóng ghim ở một vị trí rất lạ trước khi giao tài liệu cho khách hàng, Bi hỏi "ủa sao đóng vị trí lạ vậy?", nó bảo: vì để ý khách hàng hay kẹp bằng cái file này, nếu mình đóng như vầy khi họ dùng cái file của họ họ sẽ dễ tìm hơn. Ôi Bi mới học được hoá ra bọn Nhật nó kỹ kinh dị, đến cả việc đóng ghim trang giấy và quan sát khách như cú vọ để ko bị mắc cái lỗi nào hehe.
Mới thấy là để kiếm ra được đồng tiền hơn người, tốt nhất là từng nhân viên đều phải như gắn ăng-ten lên não vậy, ăng-ten là phải quan sát bốn phương tám hướng, đừng sa đà tám gẫu lảm nhảm, để rồi khách hàng sẽ chỉ tin mình ta. Ta mạnh rồi thì ta sẽ đi troll đi sai thằng khác làm những việc tốn thể lực hơn. Vậy thôi à. Vậy thôi chứ Bi cũng có 開発 mấy đâu.
Bên Bi là bên 事業部 tức là bên các project, còn có một bộ phận chuyên nghiên cứu IT, kỹ thuật, process chung cho toàn cty, bên đó gọi là 技術開発本部. Bên đó thì chỉ toàn tuyển những bạn cực giỏi IT, ăn rồi chỉ ngồi nghĩ quy trình chuẩn, và các framework xịn. Nghĩ ra xong output của bên đó sẽ được áp dụng vào các 事業部 (tức là các project mà có khách hàng bên ngoài). Đám 技術開発本部 nó không có khách hàng bên ngoài, chỉ ngồi nghĩ quy trình, nhưng 単価 của bọn nó cực cao. Một bạn của bên đó sẽ có 単価 cao gấp đôi một bạn bên 事業部 như Bi chẳng hạn.
Mô hình của cty Bi thì vendor ngoài bên dưới nó biết hết cả mà. Nó còn ngóng tin hành lang nhân sự bên Bi nhanh như điện, ngóng để biết bên Bi thay đổi nhân sự như thế nào rồi mà biết o bế ai cho nó hiệu quả, lại được thêm project.
Cuối cùng thật ra cty Bi chỉ có là cái brand, lòng tin KH, và khả năng + process quản lý guồng máy lớn thôi. Chứ thật ra IT technology thì giờ ai cũng làm đc, code gì ai chả code đc. Thành thử ra nó chả chăm chăm đi tuyển bọn giỏi code vào làm bao giờ, tiêu chí tuyển người của cty Bi là: sáng dạ để hấp thu nhanh, tư duy ngôn ngữ giỏi để comunication giữa người này với người kia đạt hiệu quả, thành thật ko ba liếm ba láp, và chăm chỉ. Thế là được nhận. Còn giỏi code hay ko này kia, biết nhiều hay ko ngày kia vô người train được hết. Thành ra cty Bi tuyển đủ thứ xuất thân: luật, kinh tế, xã hội học, vv...tuyển tất. Cứ em nào có potential là loại sáng dạ hấp thụ nhanh là nhận..
Bi đi làm thấy rằng tư duy ngôn ngữ nó cực kỳ quan trọng. Vô cùng luôn. Chị Mai cố gắng đào tạo cho 2 đứa có một passion với ngôn ngữ, nó sẽ là vũ khí cho mọi trường hợp sau này. Bởi vì communication là siêu cần thiết bây giờ. Tư duy ngôn ngữ tốt thì thiết kế cái gì nó cũng hợp lý, giải thích cho ai đó cũng nhanh và đủ ý, không vấp lỗi. Đi chém gió thì khách hàng nghe lọt lỗ tai, vẽ hình diễn đạt trôi chảy. Nói tóm lại là lợi trên mọi mặt. Chính vì vậy phương Tây nó cực kì coi trọng môn văn học lịch sử nghệ thuật, suy cho cùng cũng là dùng một hình thức nào đó (ngôn ngữ, hình ảnh,..) để diễn đạt điều mình cảm nhận và muốn truyền tải cho người khác. Napoleon đó, ngày còn bé toàn ngồi trong gác xép đọc hết sách này đến sách khác. Hoá ra vĩ nhân toàn thích đọc sách từ bé. Giờ thấy trẻ em VN toàn bấm facebook chụp ảnh tự sướng tán dóc vớ vẩn, đến là ngán ngẩm. Nhìn người Do Thái dạy con á, toàn dạy ra thiên tài bằng cách cho nó đọc sách từ bé xíu, vậy mới đẻ ra Einstein hehe. Mình ko cần con mình là thiên tài nhưng là một đứa trẻ có khả năng cảm thụ tốt EQ cao thì ko gì bằng...

@Bài Viết của Kevin

Cách tiếp cận 1 ngôn ngữ/công nghệ mới (P.2)

Nối tiếp phần 1, ở phần này mình sẽ nói rõ hơn về quá trình tiếp cận công nghệ của bản thân. Trước khi bắt đầu, mong các bạn hãy giữ 3 tư tưởng sau:
1. Học một ngôn ngữ/công nghệ mới không khó. Mình biết có nhiều bạn rất ngại, rất sợ học cái mới, hễ nghe nói cái gì là lạ là lắc đầu nguầy nguậy, bảo “không biết”. Chúng ta nên có tư tưởng là “không phải không biết mà là chưa biết, chịu khó tìm hiểu một tí là biết thôi thôi”. Mình đã giải thích lý do chúng ta có thể tiếp cận công nghệ mới một cách dễ dàng ở bài viết này.
2. Để học được nhiều cái mới, bạn cần phải giỏi tiếng Anh, không ngại đọc (Không cần giỏi cả 4 kĩ năng, chỉ cần giỏi reading là được). Ngoại trừ một số ngôn ngữ cũ như C, C++ được nhiều dạy ở nhiều trường , có tài liệu tiếng Việt, các công nghệ mới như NodeJS, AngularJS, Entity Framework thường chỉ có tài liệu hoặc hướng dẫn tiếng Anh. Nếu chỉ chăm chăm tìm tài liệu tiếng Việt, chỉ biết há miệng chờ hàng người ta dịch sẵn, bạn sẽ đi sau thời đại. Ngoài ra, với vốn tiếng Anh kha khá, khi có bug hoặc gặp vấn đề khó giải quyết, bạn sẽ dễ google và tìm câu trả lời hơn.
3. Hạn chế hỏi linh tinh, hãy google trước khi hỏi . Mình rất đồng tình với quan điểm “không biết phải hỏi, không giấu dốt”. Tuy nhiên, dân lập trình viên nói chung rất ghét những câu  hỏi ngu, lười suy nghĩ. Trước khi hỏi, hãy thử tìm google trước. Có khi bạn hỏi chỉ mất 1 phút là có câu trả lời, google để tìm câu trả lời mất tới 1 tiếng. Nhưng trong 1 tiếng đó, bạn sẽ học được rất nhiều điều liên quan khác, cả những điều bạn không biết mình cần phải hỏi.
simpsons_board
Các bạn nhớ đọc lại phần 1 để hiểu khái niệm về: fundamental, information và skill nhé. Dưới đây, mình sẽ chia sẻ quy trình mình áp dụng để học một công nghệ mới. Tất nhiên không phải công nghệ nào cũng vậy, tùy vào việc mình rành kiến thức nền tảng – fundamental của công nghệ đó tới đâu:

Tìm tài liệu học – Giai đoạn sơ khởi

Đây là bước quan trọng nhất. Nếu có người quen rành công nghệ này, bạn có thể nhờ họ chỉ từ khóa, tên sách, website v…v để mình có thể tự tìm hiểu. Họ cũng sẽ chỉ cho những gì cần học. (VD: mình muốn học thiết kế web, cần học trước về html, css, javascript, jQuery.).
Trường hợp xui xẻo hơn, nếu bạn không có người quen, có thể lên amazon.com, đánh tên công nghệ mình muốn học, sau đó chọn 1,2 cuốn ebook đứng đầu, tìm bản ebook và bắt đầu học. Lưu ý là chỉ cần 1, 2 cuốn, không nhiều hơn nhé, nhiều hơn bạn sẽ lười và không đọc đâu. Mình biết có nhiều bạn tải gần cả trăm MB ebook, tưởng mình giỏi, nhiều tài liệu mà bản thân họ chẳng đọc bao giờ.

Bắt đầu học – Giai đoạn nhập môn

Tại sao mình lại khuyến khích bạn học từ sách, mà không phải là học qua website, forum… hay gì đó. Lý do là khi xuất bản một cuốn sách, tác giả thường trau chuốt + soạn sẵn một chương trình học cho bạn. Các kiến thức được trình bày trong sách theo thứ tự tuần tự mạch lạc. Đây là giai đoạn các bạn bổ sung kiến thức dạng nền tảng (fundamentals) và infomation về công nghệ mình muốn học.
Sách technical dĩ nhiên vẫn có code. Mình khuyên các bạn nên làm theo hướng dẫn trong sách, setup môi trường, phải code theo (Đừng đọc code rồi gật gù ờ ờ nhé, chẳng thấm được gì đâu). Lưu ý là gõ code bằng tay để hiểu, không copy code vào rồi chạy nhé. Vừa gõ, vừa sửa code, vừa thử nghiệm, các bạn sẽ dần dần có một cái nhìn rõ ràng hơn về công nghệ mình đang học. Mình đã tự học HTML, CSS, Javascript, jQuery theo cách này, thông qua series sách Head First.
Một số series hay để nhập môn: xxx For Dummies, Head First xxxsách khác của O’Reilly. Những sách này có ngôn ngữ đơn giản, ảnh minh họa nhiều, việc học rất vui và nhẹ nhàng. Có một số cách học khác như học qua video trên pluralsight, code ngay với codeschool, cũng khá trực quan và dễ hiểu.
ebook

Áp dụng kiến thức – Giai đoạn nâng cao

Bạn đừng lo nếu mình đọc được 1 nửa cuốn sách đã chán, mình cũng từng như vậy. Đọc được 1/2 hoặc 2/3 cuốn sách, bạn đã có kha khá kiến thức nền tảng, cùng 1 chút kiến thức chuyên sâu về công nghệ mình học. Lúc này sách vở không còn nhiều tác dụng nữa, bạn hãy thử áp dụng kiến thức mình đã học vào thực tế.
Bằng cách nào? Hãy thử viết một phần mềm to-do-list, hoặc một trang web to-do-list, hoặc 1 blog bằng công nghệ mình đang học. Đây là những phần mềm dễ viết, yêu cầu rõ ràng, nhưng lại cho bạn cơ hội để tự trải nghiệm công nghệ mình học qua việc làm các chức năng: Chức năng hiển thị, thêm bớt xóa sửa, kết nối database ,…. Nếu gặp khó khăn trong quá trình làm, bạn có thể xem lại sách, tìm cách giải quyết tương tự, hoặc lên stackoverflow để hỏi. Sau khi làm xong, hãy ráng trau chuốt source code, sau đó upload nó lên github. Bạn vừa có project để tham khảo, hướng dẫn cho người sau, vừa có project để giới thiệu cho nhà tuyển dụng.
Ở giai đoạn áp dụng này, bạn sẽ học được nhiều skill, qua đó củng cố thêm fundamental và infomation. Bạn tốt của bạn ở giai đoạn này là stackoverflow hoặc 1 số sách dạng cookbook. Những sách cookbook này khá hay, chúng hướng dẫn cách dùng công nghệ để giải quyết một số yêu cầu thường gặp khi code (Cách parse 1 string sang DateTime trong C#, cách validate 1 form trong jQuery, …)
keep-calm-and-code-on-821
Trên đây là 3 giai đoạn các bạn sẽ trải qua trong quá trình tiếp cận công nghệ. Khi cảm thấy mình có thể giải quyết 80% mọi vấn đề gặp phải, các bạn đã đạt tới cuối giai đoạn “áp dụng”. Các bạn có thể bỏ thời gian nghiên cứu chuyên sâu hơn, hoặc chuyển qua tìm hiểu công nghệ mới, tùy vào đam mê của mỗi người.
Dĩ nhiên mỗi người có một cách học khác nhau, đây chỉ là cách tiếp cận của cá nhân mình. Các bạn có thể góp ý, đóng góp cách học của mình bằng cách comment cho bài viết. Hoan nghênh mọi ý kiến đóng góp của các bạn. Xin chia sẻ một course pluralsight khá hay về cách học: http://www.pluralsight.com/courses/learning-technology-information-age.
(toidicodedao.com)

Design Bí kíp – Hồi 2: UML truyền thuyết

Hồi 2
Mang danh thợ code lòng sao xứng
Tên gọi Design dạ chẳng yên
Lại nói hồi trước, tại hạ vốn là một anh coder nhờ cơ duyên mà kì ngộ Steve Job tiên sinh, được người truyền cho cuốn “Design Bí lục”. Tại hạ vô cùng mừng rỡ, ngày đêm rèn luyện nghiền ngẫm bí kíp, với mong muốn trở thành 1 software designer, kĩ sư phần mềm thực thụ.
Nào ngờ, tại hạ áp dụng cách học sai lầm của thời sinh viên, có học mà chẳng có hành, chỉ biết tập trung học lý thuyết thuộc làu mà không có thực tế hành tẩu giang hồ. Dẫn tới mấy tháng trôi qua, bí kíp đã đọc làu thông, mà không biết cách áp dụng. Lại thêm làm outsource lâu năm, chủ yếu là coding với UT, khiến kiến thức design có học mà chẳng có đất dụng võ. Kết quả là
Xưa hồi sinh viên cài win dạo
Nay lúc ra trường lại code thuê
Rồi một thời gian trôi qua, hết project này đến project khác, hết OT rồi lại ON, làm việc hùng hục nhưng trình độ ngày càng xuống, con đường nghề nghiệp tương lai tối thui như đêm 30
Hôm đó, dự án deliver nên tại hạ phải ở lại cty ON, đêm đã về khuya, bụng đói mà chỉ có gói mỳ Hảo Hảo cầm hơi, bưng bát mỳ tôm mà chan đầy nước mắt, tại hạ chỉ biết ngửa mặt lên trời kêu lớn
“Xin lỗi em, anh chỉ là thằng…thợ code”
Đúng lúc đó, trên bầu trời phía đông phương, một vì sao sáng rực chiếu sáng đêm đen, bất ngờ sa xuống xứ Nhật Bổn, đất Osaka.
Tại hạ chợ nghĩ “ Nay Nhật Bản môn công nghệ thông tin ngày càng phát triển, là vùng đất ngọa hổ tàng long, sao không lên đường tầm sư học đạo để tìm lối thoát cho bản thân?
Đã thích là phải nhích, tại hạ xin sếp lên đường sang Nhật onsite, rồi sang Mỹ làm việc, học được triết lý Kaizen của Nhật Bản môn, luyện thành phương pháp Sigma của Hoa Kì phái. Kết hợp công pháp của 2 phái, cuối cùng, cũng đã ngộ được những huyền cơ trong design bí kíp, công lực tăng tiến vượt bậc
(Kaizen là một thuật ngữ kinh tế của người Nhật, được ghép bởi từ  (“kai”) có nghĩa là thay đổi và từ  (“zen”) có nghĩa là tốt hơn, tức là “thay đổi để tốt hơn” hoặc “cải tiến liên tục”. Đây là triết lý cốt lõi của người Nhật để cái tiến quy trình làm việc, nâng cao năng suất
6 Sigma là hệ thống bao gồm các công cụ và chiến lược nhằm nâng cao quá trình hoạt động do hãng Motorola phát triển đầu tiên vào năm 1985. 6 Sigma trở nên phổ biến sau khi Jack Welch áp dụng triệt để nó trong chiến lược kinh doanh của ông tại General Electric năm 1995 và ngày nay phương pháp này được sử dụng rộng rãi trong nhiều lĩnh vực công nghiệp khác nhau) Đây là triết lý được các tập đoàn Mỹ áp dụng )
Cuốn bí kíp đồng thời giải thích về truyền thuyết UML, một ngôn ngữ mô hình gồm các ký hiệu đồ họa mà các phương pháp hướng đối tượng sử dụng để thiết kế các hệ thống thông tin. Do 3 nhà khoa học máy tính phát triển là James Rumbaugh, Grady Booch và Ivar Jacobson. Sau đó được tổ chức ISO chấp nhận và công bố rộng rãi.
15 năm trước, 4 vị nhất đại tông sư của giới công nghệ là Steve Job của Apple, BillGate từ Microsoft, LarryPage thuộc Google và Konosuke Matsushita của Panasonic đã hội ngộ tại Silicon Valley, cùng đem hết tuyệt học của bản thân mà viết lên cuốn bí lục này, mô tả chi tiết về các đồ hình UML, design pattern,… với mong muốn lưu lại cho hậu thế
Tại hạ vốn là fan của Apple nên được Steve Job truyền lại cho cuốn bí lục này, ngộ ra được những đồ hình kì bí mà các vị tổ sư để lại, nay share lại cho võ lâm đồng đạo
Aggregation
Aggregation
Aggregation là mối quan hệ has-a khá phổ biến trong hướng đối tượng, trong đồ hình trên, đối tượng Phệ Huyết Châu và Nhiếp Hồn Bổng là bảo vật của Trương Tiểu Phàm. Tuy nhiên, nếu Trương Tiểu Phàm chết, thì Phệ Huyết Châu và Nhiếp Hồn Bổng vẫn tồn tại
Công pháp đã thuộc, nhưng thi triển ra sao, đối với loại đồ hình này sẽ code như sau
class PheHuyetChau {
 void hutMau();
}
final class TruongTieuPham {
  private PheHuyetChau chau;
  void setHuyetChau(PheHuyetChau chau) {
    this. chau = chau;
  }
  void doCongPhap() {
    if (chau!= null)
      chau.hutMau();
  }
}
Composition
Composition
Đây là 1 dạng quan hệ Aggregation nhưng ở dạng strong type. Ví dụ đồ hình trên, đối tượng Lục Tuyết Kỳ có Chân và Ngực, đó là bộ phận cơ thể của Lục Tuyết Kỳ, nếu Lục Tuyết Kỳ chết, thì Chân, Ngực cũng tự khắc teo tóp mà thành xương khô
Công pháp này được thi triển như sau
final class LucTuyetKy {
  private final Chan chan;
  LucTuyetKy (Chan specs) {
    chan = new Chan (specs);
  }
  void khinhCong() {
    chan.move();
  }
}
Nhìn vào code trên, sẽ thấy khi đối tượng Lục Tuyết Kỳ được tạo thì đối tượng Chân mới được khởi tạo. Nó tồn tại life-time với đối tượng parent là Lục Tuyết Kỳ
Association
Association cũng thể hiện quan hệ giữa hai đối tượng, nhưng mỗi đối tượng đểu có life cycle riêng và không có mối quan hệ kiểu owner
Tuy nhiên association là mối quan hệ ẩn chứa rất nhiều huyền cơ, e rằng võ lâm đồng đạo không phải ai cũng hiểu sâu hết được
Trước hết bắt đầu bằng đồ hình đơn giản nhất
Association
Đối tượng TruongTieuPham và TruTienKiem là 2 đối tượng độc lập, và không phải owner. TruTienKiem là của Thanh Vân môn không phải của Trương Tiểu Phàm. Nhưng đối tượng TruongTieuPham đã Thi Triển TruTienKiem, đối tượng này biết có sự tồn tại của TruTienKiem
class TruTienKiem {
 };
  class TruongTieuPham {
 private TruTienKiem kiem; 
 }
Đối tượng TruTienKiem là một instance member của đối tượng TruongTieuPham. Kí hiệu 1..1 tức là 1 đối tượng TruongTieuPham chỉ có thể thi triển 1 đối tượng TruTienKiem, ngược lại nếu là 1..N tức là có thể thi triển nhiều đối tượng tru tiên kiếm
Khi đó công pháp phải thay đổi cách thi triển như sau
class TruongTieuPham {
 private List<TruTienKiem> kiem;
}
Tuy nhiên trong đồ hình này còn có 1 bí pháp gọi là Navigable, đây là 1 công pháp đã thất truyền nên võ lâm ít người nghe đến
Association2
Association3

  • Navigable được thể hiện bằng dấu mũi tên
  • Non navigable được thể hiện bằng dấu x
  • Unspecifed navigable được thể hiện bằng nét thẳng
Đồ hình ở trên có nghĩa là đối tượng Person làm việc cho đối tượng Company, nhưng không phải Company làm việc cho Person. Đây là quan hệ một chiều, đối tượng Person biết về sự tồn tại của Company (navigable), nhưng Company không biết đối tượng Person (non navigable).
Khi runtime, thông qua instance của đối tượng Person, có thể truy cập được đối instance của Company (Biết được Person đấy làm việc cho Company nào), Nhưng ngược lại thì không thể
Công pháp thi triển
class Person {
 private Company company;
}
class Company { 
}
Class Person có reference tới company nhưng Company không hề reference tới person
Tương tự , nếu đồ hình với 2 mũi tên như ở dưới
Association4
Có thể luận ra công pháp thi triển là
class Person {
 private Company company;
}
class Company {
 private Person person;
}
Đến phần này, có thể võ lâm đồng đạo sẽ bị tẩu hỏa nhập ma vì mỗi quan hệ phức tạp giữa các đối tượng, chúng khác nhau như thế nào. Rất may, cuốn bí kíp cũng đã giải thích rất rõ ràng
Vậy 3 quan hệ trên khác nhau ở điểm nào ??
Associate giữa hai đối tượng được khởi tạo qua reference properties (class attributes)
Class A có quan hệ Associate với class B tức là 1 class A có member có kiểu class B
class A {
 private B b;
};
Class A có quan hệ Aggregation với class B khi class A có method dùng B như parameter
class A {
 void doXXX(B b) {};
};
Class A có quan hệ Composition với class B khi constructor của class A dùng B như parameter
class A {
 A (B b){
 new B(); 
 }
};
Khi Instance A được khởi tạo thì instance B cũng được khởi tạo, chúng tồn tại và bị hủy đồng thời
Trên đây chỉ là 1 chương mở đầu của bí kíp, ở tầng thấp nhất, thực tế cuốn bí kíp còn lưu rất nhiều công pháp bí truyền trong thiên hạ như Sequence thuật, Design Pattern thần công… Thật sự không bút nào tả xiết
Muốn biết những công pháp bí truyền của Design Bí lục ra sao, đón xem Hồi 3: Bí ẩn sequence
Nếu võ lâm đồng đạo quan tâm tìm hiểu thì hãy contact NguyenDT4 để cùng đàm đạo.

The Ultimate XP Project

  (Bài chia sẻ của tác giả  Ryo Amano ) Trong  bài viết  số này, tôi muốn viết về dự án phát triển phần mềm có áp dụng nguyên tắc phát triển...