Vue.js là một thư viện Javascript để xây dựng giao diện người dùng. Năm ngoái nó bắt đầu trở nên khá phổ biến đối với các nhà phát triển web. Nhẹ, tương đối dễ học và mạnh mẽ là ưu điểm của nó.
Bài viết này, trang bị cho một số kiến thức để bắt đầu xây dựng các ứng dụng Vue.js cơ bản. Nào cùng tìm hiểu thôi!
Mẫu cú pháp và dữ liệu
Cốt lõi của Vue.js là một cú pháp mẫu đơn giản như sau:
<div id="myApp">
{{ message }}
</div>
Ghép chúng với đoạn code JavaScript sau:
var myApp = new Vue({
el: '#myApp',
data: {
message: 'Hello world!'
}
})
Và nó sẽ cho ra kết quả Hello world! Đang được hiển thị trên trang web.
Phần el: #myApp yêu cầu Vue hiển thị ứng dụng bên trong phần tử DOM bằng id của myApp. Đối tượng data là nơi đặt dữ liệu bạn muốn sử dụng trong ứng dụng của mình. Chúng tôi đã thêm một khoá vào đây, message, và tham chiếu trong HTML của chúng tôi như sau: {{ message }}.
Vue quan tâm liên kết đối tượng data đến DOM, vì vậy nếu dữ liệu thay đổi, trang cũng sẽ được cập nhật.
Đây được gọi là declarative rendering. Bạn chỉ cần chỉ định những gì bạn muốn cập nhật và Vue sẽ biết thực hiện điều đó.
Bạn có thể thay đổi dữ liệu bằng cách này:
myApp.message = 'Some new value';
Directives
Khái niệm tiếp theo bạn sẽ cần phải học là directives. Directives là các thuộc tính HTML có tiền tố v-, thể hiện cách chúng phản ứng với DOM được hiển thị.
Giả sử chúng ta chỉ muốn render một cái gì đó nếu điều kiện là đúng và ẩn nó đi nếu điều kiện đó là sai. Thì chúng ta sẽ sử dụng v-if.
Trong HTML, nó trông như thế này.
<div id="app">
<p v-if="seen">Now you see me</p>
</div>
Trong JavaScript:
var app = new Vue({
el: '#app',
data: {
seen: true
}
})
Điều này sẽ dẫn đến việc hiển thị đoạn “Now you see me” nếu thấy trong dữ liệu là đúng. Để ẩn đoạn văn, bạn có thể đặt thành false, như sau:
app.seen = false;
Ngoài ra có rất nhiều directives khác, như v-for, v-on,v-bind và v-model.
Xử lý Input của người dùng
Một directive quan trọng bạn cần phải học là v-on. Nó sẽ nối một event listener vào phần tử DOM, để bạn có thể xử lý Input của người dùng. Bạn chỉ định loại event sau dấu hai chấm. Vì vậy, v-on:click sẽ “lắng nghe” các cú nhấp chuột.
myClickHandler đề cập đến khóa có cùng tên trong các đối tượng methods . Không cần phải nói, đó là đối tượng mà bạn đặt các method của ứng dụng. Bạn có thể bao nhiêu method mà bạn muốn.
var app = new Vue({
el: '#app',
methods: {
myClickHandler: function () {
console.log('button clicked!');
}
}
})
Điều này sẽ giúp nút đăng nhập chuyển người dùng đến giao diện điều khiển khi nhấp vào nút.
Kết hợp tất cả lại với nhau
Bây giờ chúng ta hãy tạo ra một ví dụ mà chúng ta sử dụng cả dữ liệu và method, kết hợp những gì chúng ta đã học được cho đến bây giờ.
var app = new Vue({
el: '#app',
data: {
message: 'Start message'
},
methods: {
changeMessage: function () {
this.message = 'The message has changed!'
}
}
})
Ban đầu, nó sẽ hiển thị thông báo “Start” trên trang, tuy nhiên sau khi nhấp chuột nó sẽ hiển thị thông báo này đã thay đổi để thay thế.
Từ khóa this đề cập đến trong ví dụ của Vue này chúng tôi gọi là app. Trong trường hợp này, dữ liệu của chúng ta đã tồn tại, vì vậy chúng ta có thể tham khảo dữ liệu message thông qua this.message.
Hy vọng với những kiến thức cơ bản về Vue.js được cung cấp trong bài viết đã đủ để giúp bạn hiểu về Vue.js và có thể bắt đầu tạo các ứng dụng đơn giản với Vue.js.
Dành cho những nhà phát triển muốn tự học trong thời gian ngắn. Nó sẽ chỉ cho bạn các bước để tạo một Ứng dụng Android sử dụng Kotlin làm ngôn ngữ chính. Bạn sẽ học theo tốc độ của riêng mình mà không mất thời gian làm các bài kiểm tra thử và sai.
Với Kotlin dành cho Nhà phát triển Android, bạn sẽ học được:
Cách tạo ứng dụng Android từ đầu bằng Kotlin. Tất cả những điều cơ bản bạn cần để tạo một ứng dụng.
Cách áp dụng ngôn ngữ cho Android. Các tính năng độc quyền cho Android và tương tác với khuôn khổ.
Cách sử dụng các công cụ phát triển, tích hợp Kotlin vào Android Studio và sử dụng nó trong các dự án của bạn.
Thông qua các ví dụ và cách viết mã, mọi thứ đều thực tế 100%
Như thế nào là 1 trang web có UX tốt? Muốn trở thành UX Design thì các bạn lập trình viên cần lưu ý điều gì? Tất cả đã được giải đáp tại buổi phỏng vấn của TopDev với anh Trần Trọng Thanh – người đồng sáng lập của Nâu Studio xoay quanh những kinh nghiệm quý giá liên quan đến UX/UI.
1/ Được biết Nâu Studio hoạt động thiên về Thiết kế, nên ắt hẳn công ty mình sẽ mạnh về UX/ UI Design – lĩnh vực còn chưa phát triển nhiều tại thị trường Việt Nam?
Vì được vấn đề đó nên mục tiêu và định hướng ban đầu khi thành lập công ty là muốn đào sâu về Front End và UX/UI. Tụi anh làm ra những sản phẩm cho khách hàng & mang tính duy nhất, không dùng đến template, bootstrap hay những CSS frameworks. Nâu Studio hầu hết đều code lại từ đầu, làm sao để giao diện, theme của mình hoàn toàn khác biệt. Tất nhiên bên mình cũng sử dụng những nguyên tắc, chuẩn mực UX cơ bản nhất để build như các best practices về vị trí đặt button, menu, kích thước font…
2/ Vậy 1 bạn lập trình Web muốn tìm hiểu về UX thì các bạn cần phải tập trung vào những điểm nào?
Thực ra đối với các lập trình viên, đầu tiên các bạn khoan quan tâm đến UX mà hãy rèn luyện kĩ năng lập trình của mình trước. Khi đã thuần thục rồi, thì lúc đó mới bắt đầu thoát ra hơn, suy nghĩ thêm những thứ liên quan đến trải nghiệm người dùng, những thứ không nằm trong bài vở mà thuộc về kinh nghiệm. Khi nói về UX, đòi hỏi các bạn phải làm nhiều, đồng thời phải có những tích lũy về kiến thức như đọc những bài viết, sách UX liên quan
Thực sự là ở Việt Nam mình cũng chưa có những trường lớp nào chuyên dạy UX 1 cách bài bản. Nếu có thì hầu hết vẫn dừng ở mức sử dụng công cụ, còn để thực sự hiểu UX thì mình cần có nền tảng liên quan đến principles. Trong đó anh thấy 1 cuốn sách rất hay mà các bạn nên đọc là Don’t Make Me Think, phù hợp với cả những bạn chưa biết gì về UX Design. Quyển này đặt ra những vấn đề tuy rất hiển nhiên nhưng chúng ta hầu như không để ý, hệ thống hóa lại các vấn đề đó thành những principles. Từ những kiến thức nền tảng đó, các bạn mới đọc đến những cuốn sách đi sâu vào thực tế.
Ngoài ra khi bắt tay vào làm giao diện thiết kế, việc bắt chước điều hoàn toàn bình thường. Hãy nghiên cứu những trang web được giải thưởng vì đây là những showcase rất hay để học hỏi.
3/ Khi tuyển dụng các bạn lập trình viên cho Nâu Studio, không biết anh có yêu cầu skill nào đặc biệt không?
Anh cũng thay đổi tiêu chuẩn tuyển dụng của mình 1,2 lần để đạt được mục đích tuyên dụng nhưng định hướng trước đây và hiện tại vẫn luôn nhấn mạnh vào thái độ của các bạn với công việc thông qua những trao đổi trực tiếp hay khi mình đưa ra những tình huống để các bạn xử lý. Từ đấy mình sẽ đánh giá được các bạn có thích công việc hay không, có nghiêm túc, có chuyên nghiệp hay không.
Anh lúc nào cũng muốn tìm 1 nhân sự, 1 người đi lâu dài với công ty nên tụi anh rất chú trọng đến định hướng về sự nghiệp của các bạn. Các bạn lập trình viên vào Nâu Studio phải xác định rõ ràng là các bạn ấy có thực sự thích Front End hay không, có thật sự thích những công việc mà anh sẽ giao cho các bạn làm hay chỉ vào làm cho đúng giờ, đúng ngày.
Điểm khác nữa là khả năng tư duy. Đây là điểm mà các bạn lập trình viên rất cần có để tiến xa hơn trong công việc. Đối với các bạn fresh, Nâu Studio có đưa ra 1 bài test về IQ trên platform online. Sẽ có điểm ngưỡng để anh đánh giá mức độ phù hợp với công việc vì tư duy logic là điều không thể thiếu ở các bạn lập trình viên. Khả năng giao tiếp, soft skills thì mình có thể định hướng và hướng dẫn sau.
4/ Nói về thái độ làm việc của lập trình viên, thì anh có thể chia sẻ thêm về văn hóa của Nâu Studio?
Như đã đề cập trên website, Nâu Studio tập trung vào trải nghiệm của người dùng và trải nghiệm của lập trình viên. Trải nghiệm của người dùng tức là những sản phẩm, những thành quả của Nâu Studio đưa ra đều rất chú ý đến UX và UI. Về phía các bạn lập trình viên thì anh thường nhắc nhở các bạn chú ý đến những chi tiết giúp tăng UX cho người dùng, chẳng hạn như button phải có hiệu ứng chạm để người dùng biết là họ đã chạm đúng. Hoặc như 1 link theo chuẩn Mobile-first thì phải có kích thước tối thiểu là 40 pixel vì nếu các bạn làm quá nhỏ, thì tay rất khó đụng tới được vùng chạm. Ngoài ra còn có những chi tiết về màu sắc, font chữ… phù hợp với thiết bị di động hay desktop. Đây là những bước đầu tiên mà các bạn cần chú ý, để sau này khi các bạn lên vị trí Senior, có thể truyền lại cho các bạn mới.
Ngoài ra, văn hóa của Nâu Studio là chia sẻ những gì mà các bạn tìm hiểu được thông qua kênh chat chung. Tụi anh cũng có riêng 1 ngày là Friday Sharing để 1 bạn đại diện đứng lên thuyết trình về chủ đề tự do, không nhất thiết đến kĩ thuật vì buổi thuyết trình có sự tham gia của cả Designer, HR, Admin, Manager, Dev…
Điểm nữa mà Nâu Studio cũngrất tự hào đó là khâu đào tạo mảng đào tạo nhân sự. Tụi anh xác định ngay từ đầu các bạn lập trình viên là những người sẽ đi lâu dài cùng mình, là những người làm những dự án lớn và phức tạp hơn mà tụi anh sẽ giao nên tụi anh đào tạo các bạn rất kĩ. Như hiện tại Nâu Studio tập trung vào Front End và Javascript nên các bạn sẽ được nắm vững các kiến thức nền, sau đó mới học tiếp những nội dung khác như ReactJS, NodeJS…
Nguyên tắc làm việc của Nâu Studio là rất chú trọng quy ước khi lập trình – đây cũng là trải nghiệm cho lập trình viên mà anh muốn nói đến. Nâu Studio có 1 bộ quy chuẩn cho việc viết code, cùng những công cụ để kiểm tra các bạn đã viết đúng hay chưa, từ đó mới có thể gò các bạn vào 1 nếp để viết cùng 1 style với nhau, cùng best practice với nhau. Điều này đặc biệt có lợi trong trường hợp phải thay người mới thì họ sẽ bắt đầu rất nhanh, hạn chế những khó khăn khi đọc code do thay đổi văn phong, quy ước.
5/ Quy trình này là của riêng Nâu Studio hay có thể áp dụng được ở những nơi khác?
Team nào cũng có thể áp dụng được nếu họ thấy phù hợp.. Anh đang tổng hợp lại các tài liệu và open source tại http://code.naustud.io/ và sẽ chia sẻ bộ quy ước này rộng rãi đến cộng đồng trong thời gian tới . Bộ quy ước này cũng dựa trên những quy ước đến từ các công ty lớn như Javascript thì dựa trên quy ước của Airbnb, Google cũng như những công ty lớn khác…
6/ Thiết kế UX cho 1 website nước ngoài sẽ có những khác biệt gì so với thiết kế UX của 1 website cho người Việt Nam, chẳng hạn cho những user là người lớn tuổi?
Nói ví dụ về icon thì bọn anh đều có text đi kèm, dùng dạng label nhiều hơn. Còn về cách sắp đặt vị trí thì bên anh vẫn chưa thấy có gì quá khác biệt. Có thể là vì các sản phẩm của Nâu đa phần vẫn tập trung vào đối tượng người trẻ, biết về kĩ thuật nên mình cùng chỉ dựa trên những practices chung. Trong trường hợp có yêu cầu với các đối tượng đặc biệt thì bên anh sẽ tổ chức những buổi usability testing với những đối tượng người dùng thật để đánh giá phản ứng của họ với giao diện thử nghiệm . Dựa trên đó mình sẽ lưu ý lại và đưa ra những điều chỉnh phù hợp.
7/ Theo anh những điểm nào để đánh giá thành công về mặt UX của 1 website?
Theo tiêu chuẩn của Nâu Studio, website phải load nhanh dưới 2s. Tụi anh làm được điều này vì những công nghệ của NodeJS cũng đã tối ưu và rất nhanh. Ngoài ra, tụi anh cũng áp dụng các công cụ tự động hóa để tối ưu Front End từ lúc code cho đến lúc deploy.
Thứ 2 là website đó phải mobile-friendly như font chữ phải vừa mắt, kích cỡ nút và link phải phù hợp, giao diện tùy ứng (responsive UI) phải cung cấp được thông tin phù hợp nhất cho các user sử dụng di động. Các thống kê của 2017 xác nhận là người dùng đã vào web bằng thiết bị di động với màn hình chạm nhiều hơn trên máy tính (laptop, desktop), nên Mobile-first là điều bắt buộc. Tất cả các website mà Nâu Studio làm đều xuất phát từ Mobile, sau đó mới mở ra layout cho desktop. Cách tiếp cận code cũng như vậy như Code CSS cho Mobile trước tiên, sau đó mới điều chỉnh cho những giao diện lớn hơn.
Đa phần thì các framework, template của WordPress chẳng hạn thì vẫn theo Desktop trước. Với cách làm này, thì CSS ban đầu mình viết ra sẽ chỉ chạy được trên Desktop, lúc này nếu mở bằng điện thoại thì cả trang web sẽ bị scale xuống, chữ rất nhỏ. Ngược lại, CSS đầu tiên viết ra sẽ dành cho Mobile thì mọi thứ sẽ dễ điều chỉnh hơn về sau.
Cách làm này đối với thế giới thì không mới nhưng ở Việt Nam thì còn khá mới.
8/ Định hướng sắp tới của Nâu Studio?
Trước đây Nâu tập trung vào outsource, làm services cho khách hàng. Nhưng sắp tới công ty đang tập trung vào sản phẩm phần mềm về quản lý nhân sự, được build theo hướng Software as a Service và sẽ được ra mắt vào cuối tháng 7. Unique Selling Point trong phần mềm này là phương pháp quản lý KPI mới: Objective – Key Results chia công việc thành những objectives và update tiến trình để đi từ 0 đến 100%. Mỗi mục tiêu sẽ được chia nhỏ theo từng cấp bậc: người quản lý, trưởng phòng ban, các thành viên…. Từ đó mình sẽ có được những cảnh báo và điều chỉnh kịp thời, tương tự như những gì Google đang làm để đưa 1 bộ máy lớn đi lên.
Facebook rất thích push content, đặc biệt là việc sử dụng video để quảng cáo. Và các bạn biết đấy, bản chất của video là những bức ảnh chuyển động. Người xưa có câu trăm nghe không bằng một thấy, giá trị của những video là rất lớn khi nói đến hiệu ứng quảng cáo.
Đó cũng là một trong những tham vọng của ông lớn Facebook với tính năng chèn video vào khung cover của các page trên Facebook.
Vốn là một admin của trang công động trên facebook với vài ngàn like, tôi khá tò mò về tính năng mới này.
Quá trình cài đặt khá dễ dàng và nhanh chóng. Bạn chỉ cần vào mục cover, chọn clip và chỉnh vị trí cũng như thêm cái thumbnail. Thế là bạn đã hoàn thành hết rồi đấy… Tuy nhiên thực tại lại hoàn toàn ngược lại.
Cái gì thế này? Đã sai ở chỗ nào nhỉ? Mặc dù bạn đã theo đúng hết theo chỉ dẫn, mọi thứ đều ổn và không hề có bất kì sai sót nào trừ việc nó hoàn toàn không thể làm được. Kết quả lúc nào cũng chỉ là bản báo lỗi hết sức ngắn gọn như gáo nước lạnh tạt thẳng vào mặt.
Và như mọi người dùng khác, bạn sẽ thử làm lại từ đầu với hi vọng biết đâu kết quả sẽ khác đi. Tuy nhiên lúc này một lỗi khác lại xuất hiện, video của bạn đã biến mất khỏi trang một cách ảo diệu.
Ngạc nhiên chưa! Content của bạn ra đi vĩnh viễn!
Thế là video mà bạn được mấy trăm like, comment đã biến mất hoàn toàn.
Nói cách khác nó bị xóa bởi một bug bí ẩn và coi như mất trắng tất cả công sức bạn bỏ ra để seed và chạy ads cho video đó.
Vậy giờ thì phải làm sao?
Gọi Facebook?
Tin buồn là cho dù bạn có gọi đi nữa thì cũng chả được ích lợi gì bởi họ sẽ cho rằng đó là lỗi của users, của chính bạn??
Nguyên văn chính xác là:
“Facebook đã phân tích vấn đề và xác định rằng video/post đó bị xóa bởi user. Đây là điều rất đáng tiếc bởi khi nó bị xóa bởi user thì sẽ không thể phục hồi được nữa”
Publish video lại?
Nhưng như vậy cũng có nghĩa là bạn đã chấp nhận mất đi tất cả lượng like, comment, share khổ cực kiếm được.
Bài học được rút ra là gì dành cho các software developer
Hãy biết chân trọng giá trị content của user. Vì thế hãy luôn cho thêm option hỏi họ có chắc không khi muốn xóa một nội dung nào đó.
Đây là bài học mà hẳn các mobile developer đều đã thuộc lòng. Cho người dùng tính năng access mạnh mẽ nhưng đồng thời cho phép họ revert lại những hành động trên.
Tôi hi vọng các developer tại Facebook cũng như các hãng công nghệ khác học được bài học qua vấn đề trên:
Đừng để có bất cứ lỗi nào có khả năng xóa content của người dùng
Cho dù user có muốn xóa content thì vẫn có tính năng phục hồi cho họ
Hãy mạnh dạng chấp nhận lỗi của mình thay vì cứ đổ lên người dùng
Với tư cách là một người dùng, tôi thấy bài học cuối cùng là quan trọng nhất. Mặc dù tôi đã tìm mọi cách chứng minh như dùng account khác nhau và quay clip lại nhưng bên Facebook vẫn tỏ ra thờ ơ và mặc định đó không phải lỗi của họ. Họ chỉ xin lỗi vì sự phiền toái do nó gây ra nhưng như vậy thì có giải quyết được gì đâu…
Nếu bạn là một coder mới vào nghề đây là cơ hội tốt để bạn biết về nhiều thứ.
Tôi đã học code trong khoảng một tháng rưỡi và đã đạt được những tiến bộ vượt ngoài mong đợi khả năng của mình.
Tôi chắc chắn đã có những chia sẻ về cuộc chiến với JavaScript trong một bài viết nào đấy. Tôi đã gặp khá nhiều vấn đề khi tiếp cận với code
Vì đây là những điều tôi đã không biết trước khi học code
Không chỉ có Google
Suốt những năm tháng còn ở trường học tôi luôn nghĩ rằng “không chỉ Google”. Các giáo viên và giáo sư là những người cho tôi điểm chứ không phải là Google. Rất nhiều lần tôi tự áp đặt suy nghĩ đó cho mình. Bởi vì, tôi muốn làm cho cuộc sống của tôi trở nên khó khăn hơn.
Khi bắt đầu học code tôi cũng vận dụng tâm lý đó.
Mặc dù tôi biết rằng không có cách nào để biết tất cả mọi thứ – mặc dù xung quanh tôi có rất nhiều người (bạn bè, đối tác của tôi và các giáo viên của Treehouse) – Tôi vẫn cố gắng tự giải quyết vấn đề của mình mà không cần quan tâm tới mọi thứ xung quanh. Tôi chỉ tin tưởng vào trí nhớ của mình và các ghi chú, một vài giả định hợp lý. Phải nói rằng điều đó hoàn toàn không có lợi cho việc học tập.
Khi bắt đầu học code, không có cách nào để giữ lại mọi thứ. Có quá nhiều thông tin trong đó: thư viện, frame, ngôn ngữ, thay đổi cú pháp và các tiến trình, phương pháp không phù hợp. Có quá nhiều thứ ở đó.
Cộng đồng lập trình được xây dựng dựa trên sự chia sẻ kiến thức và điều đó không làm giới hạn kiến thức của bạn
Bài học: Google mọi thứ.
Không chia sẻ công việc của bản thân
Tôi ghét khi giáo viên nói “hãy trình bày về công việc của bạn.”
Tôi nghĩa là, nếu tôi có thể giải quyết phương trình trong đầu tại sao tôi phải viết nó ra? Tại sao tôi không thể bỏ qua giai đoạn viết câu trả lời và thực hiện nó?
Vâng, có nhiều lý do khiến tôi không muốn chia sẻ về công việc của mình. Nhưng đến khi tôi học code mọi thứ phải thay đổi: Bạn phải khai báo với chương trình của bạn những gì bạn đang làm. Nếu không, nó sẽ không (hoặc không thể) làm điều đó.
Nếu bạn muốn ứng dụng của bạn tính điểm số của người chơi hoặc bạn muốn trang web của mình chỉ hiển thị 10 kết quả tìm kiếm trên mỗi trang, bạn phải thông báo cho chương trình của mình những gì bạn muốn. Chỉ suy nghĩ nó trong đầu bạn sẽ không làm cho nó hiển thị trên màn hình được.
Bài học: Hãy chia sẻ về công việc của bạn.
Không bắt đầu từ việc nhỏ
Bạn có thể dễ dàng có được ý tưởng lập trình hoặc xây dựng 1 webside – các dự án có thể mất hàng giờ / tuần / tháng để hoàn thành.
Nhưng xu hướng thường thấy, đặc biệt là đối với các lập trình viên mới, thường bắt đầu từ bước hai hoặc ba thay vì bắt đầu từ đầu.
Không phải là vì họ nghĩ rằng bước đầu tiên là không quan trọng, nhưng vì họ đã bỏ lỡ nó. Tôi biết điều đó vì đã có nhiều hơn một lần tôi lâm vào tình cảnh như vậy và tất cả chỉ vì tôi đã tìm ra công thức cần thiết nhưng không thêm nó vào dự án của tôi (xem mục số 2 trong danh sách này).
Nhưng thực tế là tất cả các ứng dụng, trang web, và vv đều bắt đầu với một dòng code.
Bài học: Bắt đầu từ những bước nhỏ
Đa nhiệm
Khi tôi bắt đầu viết code đầu tiên, tôi đã làm việc này liên tục. Nếu tôi chưa thể giải quyết được một đoạn code nào đó , tôi sẽ chuyển sang làm phần khác. Sau đó, nếu tôi vẫn không thể giải quyết được, tôi sẽ chuyển sang làm một thứ khác hoặc trở lại với những gì tôi đã làm trước đó.
Tôi đã không thực sự hiểu hầu hết những điều tôi đã làm trong công việc. Và cũng hiếm khi nào tôi thực sự hiểu những gì mình đã làm để code hoạt động.
Bằng cách tập trung vào điều mình đang làm, bạn sẽ cảm thấy khi bạn hoàn thành xong mỗi phần, bạn hiểu về code của mình và có thể nhanh chóng xác định được lỗi.
Bài học: Tập trung vào một điều. Hoàn thành nó. Sau đó, chuyển sang phần tiếp theo
Không phải tôi, đó là bạn
Trong trường hợp này, “tôi” là bạn (developer) và “bạn” là code của bạn.
Hơn một lần tôi nhìn chằm chằm vào trình chỉnh sửa văn bản của mình, đọc qua code của tôi để tìm ra lý do tại sao điều xảy ra không được như tôi mong đợi. Sau khoảng 5 phút, tôi sẽ nhận ra có một lỗi đánh máy, một lỗ hổng trong logic của tôi, hoặc tôi đã không khai báo các chức năng theo đúng thứ tự. (Điều cuối cùng xảy ra chỉ một ngày trước).
Cũng như tôi đã làm, thật dễ dàng để hiểu răng code của bạn không hoạt động vì thiếu điều gì đó. Nhưng đa phần , nó không làm việc vì một điều gì đó mà bạn – dev – đã làm.
Vì vậy, phải hiểu rằng chính bạn là người đã mắc phải lỗi, không phải code của bạn, bạn không chỉ phải biết code mà còn phải biết sữa lỗi. Một ngày nào đó bạn làm việc với tư cách như một developer thực thụ, sửa lỗi code sẽ khiến công việc của bạn dễ dàng hơn 10 lần
Bài học: Đây không phải là lỗi của code. Đó là lỗi của bạn.
Tôi không muốn đi quá sâu vào cuộc hành trình học code của mình. Nhưng, 5 điều tôi không biết trước khi học code đã có một tác động đáng kinh ngạc về cách tôi tiếp cận code, cũng như thực tế khả năng viết code của mình
Các bạn hẳn cũng biết việc chọn một framework thích hợp với PHP project của mình sẽ quyết định tính thành bại của nó. Bài viết này chính là nhằm mục đích giúp bạn chọn ra được PHP framework tốt nhất cho sự nghiệp lập trình web của bạn.
PHP được xem là một trong những ngôn ngữ script nổi tiếng nhất dành cho server. Ngay từ lúc được khai sinh ra vào 1995, tính phức tạp của web projects đã trở nên quá cao khiến cho việc code từ số không trở nên vô cùng khó khăn. Và như vậy, PHP framework trở thành một biện pháp vô cùng tuyệt vời. Trong bài viết này, chúng tôi sẽ giới thiệu cũng như phân tích và so sánh 10 PHP framework thông dụng nhất để bạn có thể chọn ra một framework thích hợp nhất.
Các lợi ích từ việc dùng PHP framework
Vì sao có rất nhiều developer lại chọn dùng PHP frameworks? Đơn giản là nó giúp công việc của chúng ta trở nên đơn giản hơn rất nhiều. Và sau đây là một số đặc điểm nổi bật của PHP frameworks:
Giúp đẩy nhanh tiến độ cho quá trình phát triển
Giúp bạn viết ra code vừa gọn, sạch mà lại tái sử dụng được.
Cho phép khả năng mở rộng tùy thuộc vào project của bạn
Được thiết kế theo MVC (Model-View-Controller) pattern
Phù hợp với cách thức mới để phát triển web, ví dụ như object-oriented programming.
Tuy vậy với 10 PHP frameworks thì có sự khác biệt như thế nào giữa chúng? Hãy cùng tôi so sánh và phân tích chúng:
Là một full-stack PHP framework với khả năng cho phép người dùng tinh chỉnh theo ý muốn, FuelPHP không chỉ hỗ trợ MVC pattern mà cả phiên bản mới là HMVC (Hierarchical MVC). Nó còn có một optional class gọi là Presenter (hồi trước thì có tên là ViewModel) với tính năng tương tự như sự kết hợp của Controller và View layers với khả năng tạo ra Views.
FuelPHP bản chất chính là một modular với khả năng mở rộng, cũng như là an toàn thông tin với các tính năng như input, URI filtering và output encoding. FuelPHP còn có nguồn tự liệu khá phong phú và thú vị mà bạn có thể tìm hiểu thêm tại đây.
Slim PHP framework
Slim cũng thuộc hàng top các framework và là một micro-framework nhưng sẽ cung cấp cho bạn mọi thứ cần thiết để tạo những ứng dụng nhỏ và vừa, mà nếu dùng “full-stack” PHP framework sẽ được xem là lãng phí.
Slim được dùng bởi các developer khi muốn phát triển RESTful APIs cũng như services. Nó có nhiều tính năng khá nổi bật như client-side HTTP caching, URL routing, session và cookie encryption. Ngoài ra, Slim còn hỗ trợ cả flash messages xuyên suốt HTTP requests. Điểm cộng khác là guide hướng dẫn Slim khá dễ hiểu.
Phalcon PHP framework
Phalcon được công bố vào 2012 và nhanh chóng tạo ra cơn sốt trong giới PHP developer. Phalcon có tốc độ xử lí nhanh vì nó được viết trên C và C++ nhằm có khả năng đạt được hiệu năng cao nhất có thể. Đừng lo, bạn sẽ không phải học ngôn ngữ lập trình C đâu bởi tất cả các tính năng của nó đều dành cho PHP classes và chỉ cần xài ngay vào luôn.
Phalcon có thể xem như là một phần mở rộng của C, với cấu trúc được thiết kế nhằm giảm thiểu vấn đề overhead, thường gặp phải đối với các MVC apps. Phalcon không chỉ tăng tốc độ execution mà còn giảm bớt resource usage. Đây là một PHP framework có rất nhiều tính nặng tuyệt vời như universal auto-loader, asset management, security, translation, caching, etc. Bạn có thể xem thêm tại đây.
Phalcon được xếp hạng 2 trong top các PHP framework tốt nhất bởi sitepoint.com vào năm 2014. Tuy vậy, đến 2015 thì nó bị đá văng bởi nhưng PHP framework tiếp theo.
CakePHP framework
Mặc dù đã được 10 năm tuổi, CakePHP vẫn giữ được độ nổi tiếng của mình. Với sự đơn giản, thân thiện với người dùng cũng như tính năng tinh chỉnh templating. Ngoài ra, Cake PHP còn tích hợp cả CRUD feature cực kì hữu ích cho việc tương tác với database. Với phiên bản gần đây, CakePHP 3.x đã có sự cải tiến về session management và modularity. Khả năng tạo ra standalone libraries cũng được nâng cao đáng kể.
CakePHP framework được các hãng như BMW vàHyundai chọn để phát triển cho web của họ. Vì thế hãy chon CakePHP nếu bạn web application đòi hỏi tính bảo mật cao bởi nó có tính hợp những tính năng như:
input validation,
SQL injection prevention,
XSS (cross-site scripting) prevention,
CSRF (cross-site request forgery) protection, etc.
Zend Framework 2
Zend Framework 2 là một open source framework dành riêng cho web applications và services dùng PHP 5.3+. Được làm từ 100% object-oriented code cũng như có các tính năng mới nhất của PHP 5.3, bao gồm namespaces, late static binding, lambda functions và closures. Zend PHP framework cực kì mạnh mẽ với đa dạng về configuration option. Chính vì thế mà tuy Zend Framework 2 không phù hợp với các project nhỏ vừa nhưng nó lại cực kì tuyệt vời đối với các ứng dụng phức tạp và lớn.
Các tính năng nổi bật có thể nói tới bao gồm: cryptographic coding tools, drag và drop editor cực kì dễ sử dùng dành cho front-end technologies (HTML, CSS, JavaScript), instant online debugging và PHP Unit testing tools, cũng như tính năng connected Database Wizard. Zend Framework được tạo ra với mục đích giúp ra đời các ứng dụng chất lượng cao cho client với qui mô lớn và chuyên nghiệp.
IBM, Microsoft, Google và Adobe đều sử dụng Zend. Năm ngoái, Zend đưa ra thông báo cho bản cập nhật lớn tiếp theo Zend Framework 3 dành cho PHP 7, nhưng vẫn sẽ hỗ trợ PHP 5.5.
Yii 2 PHP framework
Hãy lựa chọn Yii framework nếu bạn muốn tăng hiệu năng cho website của mình. Nó có tốc độ nhanh nhất trong các PHP frameworks được liệt kê nhờ vào tính năng lazy loading. Yii 2 hoàn toàn là object-oriented và dựa trên nguyên tắc DRY (Don’t-Repeat-Yourself) coding. Nhờ đó mà kết quả là bạn sẽ một code base khá gọn gàn và sạch sẽ.
Yii 2 được tích hợp với jQuery, kèm theo đó là AJAX-enabled features. Ngoài ra, Yii 2 còn sử dụng một kĩ thuật đặc biệt trong skinning và theming nên đối với các bạn đã có kinh nghiệm trong frontend thì Yii 2 rất phù hợp. Không những thế, Yii 2 còn có một class code vô cùng mạnh mẽ với generator có tên gọi là Gii. Rất phù hợp cho object-oriented programming cũng như cung cấp web-based interface để bạn có thể tạo ra code đúng theo ý muốn.
PHPixie framework
PHPixie có tuổi đời khá trẻ với gần 5 năm, được tạo ra như một framework hiệu năng cao dành riêng cho read-only websites. PHPixie cũng dựa trên HMVC design pattern như FuelPHP. Nó được làm từ các components độc lập và PHPixie components là 100%unit tested nên yêu cầu dependencies đối với PHPixie cũng ở mức thấp nhất có thể.
Bạn có thể vào trang web của PHPixie để xem tutorial với chỉ 30p. Ngoài ra, blog của PHPixie cũng là một nơi tuyệt vời để bạn xem qua. Các tính năng tiêu biểu của framework này bao gồm: ORM (object-relational mapping), caching, input validation, authentication và authorization capabilities. PHPixie cũng cho phép bạn dùng HAML markup language, enables schema migration, và có một routing system khá tinh tế.
PHPixie còn được các developer người Ukraina đánh giá là tốt nhất, theo 2015’s Sitepoint survey.
CodeIgniter PHP framework
CodeIgniter là một PHP framework khá nhẹ với hơn 10 năm tuổi. Rất thích hợp để dùng khi bạn không muốn bị vấn đề bị lỗi sai phiên bản PHP, bởi nó hoạt động rất tốt trên tất cả các hosting platforms.
CodeIgniter không hoàn toàn được xây trên chỉ MVC development pattern. Bạn sẽ cần phải dùng tới Controller classes, nhưng vẫn có thể dùng Models và Views được. Tất nhiên là bạn cũng hoàn toàn có thể xài code và naming của mình. CodeIgniter còn cho developer khá nhiều tự do bởi chỉ có nặng 2MB thôi nhưng nếu bạn muốn có thêm sự phức tạp thì có thể add các third-party plugins.
Symfony 2 PHP framework
Các components của Symfony 2 framework được dùng bởi khá nhiều projects nổi tiếng như Drupal 8 CMS, hoặcphpBB forum software, và cả Laravel. Cộng đồng phát triển của Symfony cũng cực kì nhiệt tình và rất hữu ích.
Symfony Components thực chất chính là reusable PHP libraries với khả năng giúp hoàn thành nhiều task khác nhau như: form creation, object configuration, routing, authentication, templating, etc. Bạn có thể cài bất cứ component với Composer PHP dependency manager.
Và giờ đây, tôi xin giới thiệu với các bạn PHP framework yêu thích nhất của tôi
Laravel PHP framework
Cuối cùng thì chúng ta cũng đến hạng nhất – một framework với cái tên khá là đẹp – Laravel. Mặc dù chỉ mới ra đời cách đây vài năm, Laravel vẫn được xem là PHP frame work nổi tiếng nhất hiện nay. Đó là bởi nó có một hệ ecosystem vô cùng lớn, kèm theo đó, nguồn và hướng dẫn rất chi tiết và hoàn hảo.
Nhưng vũ khí thật sử của Laravel nằm ở những tính năng cực mạnh giúp đẩy nhanh quá trình phát triển ứng dụng tới mức tối đa. Với light-weight templating engine có tên gọi là “Blade” cùng với cú pháp tinh tế cho phép bạn thực hiện những task như: authentication, sessions, queueing, caching và RESTful routing.
Sự phát triển mạnh mẽ của công nghệ và internet đã xóa nhòa khoảng cách về địa lí cũng như đánh dấu cho sự chớm nở và phát triển vượt bậc của E-Business. Chopp là một công ty công nghệ cung cấp dịch vụ shopping online dành cho mặt hàng bách hóa. Với mục tiêu biến công việc đi chợ hàng ngày trở nên tiện lợi hơn cũng như mang tới một trải nghiệm hoàn toàn mới, Chopp được đánh giá là một trong những startup đầy tiềm năng.
Hôm nay, Topdev hợp tác cùng Chopp để gởi tới bạn đọc buổi phỏng vấn với anh Nguyễn Minh Trường – CEO & Founder của Chopp về những vấn đề và khúc mắc của lập trình viên khi đi xin việc cũng như nhận định về tương lai của ngành công nghệ thông tin đặc biệt là ở lĩnh vực E-commerce.
Anh có thể giới thiệu một chút về quá trình làm việc của mình?
Chuyên ngành chính của mình thật ra là Design. Sau khi tốt nghiệp bên Mỹ thì mình có làm việc cho 1 công ty startup ở Cali trong 2 năm trước khi công ty đó được Facebook mua lại. Sau đó, Trường tới New York để làm việc cho một công ty starup khác nhưng một thời gian cảm thấy không hợp nên lại quay trở lại Cali. Tại đây mình cùng 1 người bạn quyết định làm thử một sản phẩm tại Vancouver- Canada, sau đó cùng 1 người bạn khác mở 1 công ty ở San Francisco giống mô hình Uber nhưng dành cho việc đậu xe. Không may là cả 2 dự án đều không được như mong đợi. Tuy vậy, mình rút ra được rất nhiều bài học quí giá, với sẵn cái tính của mình vốn không chịu bỏ cuộc, mình quyết định trở về Việt Nam và thực hiện dự án tâm huyết tiếp theo là Chopp.
Anh có thể nói thêm về thế mạnh kỹ thuật của Chopp?
Thế mạnh lớn nhất của Chopp là việc sử dụng nhiều công nghệ mới như NodeJs, ReactJs, … Đây là lý do tại sao Chopp xây dựng & vận hành được trên 3 platforms iOS, Android & Native Web trong vòng 20 tháng một cách ổn định & hiệu quả. Và trong thời gian tới thì Chopp sẽ bổ sung thêm phần Realtime Technologies cho Logistics. Hiện tại Logistics đã có một số tên tuổi khá lớn như Uber, Grab, DeliveryNow,.. nhưng Chopp sẽ làm tốt hơn nữa bởi nó chính là mạng sống của của Chopp.
Hiện Chopp có đang gặp khó khăn gì về mặt kỹ thuật không?
Hệ thống kỹ thuật của Chopp có nhiều mảng, xuyên suốt từ người dùng đến vận hành, ngay từ lúc khách hàng order hệ thống tiếp nhận thông tin và tiến hành xử lý, chia đơn hàng, phân công nhiệm vụ ai đi mua cái gì. Không giống với các đơn vị cung cấp dịch vụ logistics hiện nay như Uber, Grab khách hàng chỉ có thể theo dõi vị trí đơn hàng từ 1 cửa hàng, còn Chopp là theo dõi nhiều đơn hàng từ một hệ thống nhiều cửa hàng khác nhau. Như vậy khối lượng công việc để thiết kế ra một ứng dụng như Chopp là cực kì lớn.
Chopp đã đạt được những thành tựu nổi bật cho tới thời điểm hiện tại?
Thật sự mà nói, khi bắt đầu vào làm startup thì cứ như đương đầu với cả một cơn bão thương trường. Cực khổ trăm bề bởi mình đâu chỉ có ngồi viết code, bảo đảm chạy là xong việc đâu. Ứng dụng nó phải bán được, phải có users thì mới sinh ra lãi để có thể tồn tại. Nói cách khác, mình nghĩ thành tựu nổi bật nhất của một startup chẳng có gì ghê gớm ngoài việc sống sót. Bởi hễ còn thở là còn hi vọng, còn có khả năng chiến đấu giành lấy chiến thắng.
Chỉ trong 6 tuần thì Chopp đã có đơn hàng đầu tiên. Đặc biệt là những khách mới này có feedback rất hài lòng khi sử dụng dịch vụ Chopp. Đây chính là động lực thúc đẩy mà khi đó team rất cần bởi sản phẩm mình làm ra được đón nhận cũng như giúp ích cho khách hàng.
Mặt khác, Chopp dù là starup mới thành lập được 1,5 năm nhưng đã có một lượng khách trung thành cũng như việc họ giới thiệu bạn bè và người quen sử dụng Chopp cũng góp phần đẩy mạnh lượng người dùng trong thời gian trên. Vì thế nên việc có khách thường xuyên là điều mà Chopp đánh giá là một thành công nổi bật.
Vì vậy theo cam kết của Chopp thì việc sắp xếp quy trình mua hàng hợp lý để giao kịp cho khách hàng trong vòng 1 giờ là một thử thách lớn cho hệ thống của Chopp hiện nay. Bởi phải có thuật toán chính xác để giúp việc nhận đơn hàng, liên hệ với bên cung cấp hàng, sắp xếp lịch và lên lịch trình cho các bạn Chopper bên Chopp đi đưa hàng cho khách hàng.
Một vấn đề nữa mà Chopp cũng như các E-commerce khác phải đối mặt là việc áp dụng tính năng recommendation bởi việc áp dụng machine learning ở Việt Nam còn khá mới mẻ. Như vậy có thể thấy hiện E-commerce cũng có sự đòi hòi rất cao đối với khả năng tạo ra một ứng dụng có thể giải quyết được những task phức tạp trên một cách hiệu quả. Vì thế mà khác với ngộ nhận thường gặp là các bạn developer chỉ nên làm về những ứng dụng liên quan đến công nghệ thôi, E-commerce cũng là một mỏ vàng và đang có nhu cầu developer rất lớn.
Đối với LTV làm việc trong môi trường khởi nghiệp có mindset, skillset khác nhiều không so với các môi trường khác?
Kinh nghiệm cá nhân không phài là yếu tố quan trọng mà Chopp quan tâm. Chopp đánh giá cao những ứng viên ham học hỏi, có khả năng giải quyết vấn đề, quan tâm tới product của công ty và những trải nghiệm của khách hàng. Thường thì những lập trình viên làm việc trong agency hay outsourcing họ không biết cách ưu tiên task của mình, đưa ra quyết định. Còn làm việc ở Start-up thì không như vậy. Bởi startup thường phải bắt đầu từ con số không nên sẽ phải đương đầu với rất nhiều khó khăn, đòi hỏi bạn Developer không chỉ giỏi về khả năng code mà còn phải chủ động và có khả năng giải quyết vấn đề nhanh.
Việc chủ động có phải là điều lập trình viên hiện đang rất thiếu?
Đúng vậy, chủ động trong công việc là yếu tố rất quan trọng nhưng Dev Việt hiện nay còn thiếu. Việc chủ động không hoàn toàn phụ thuộc vào kinh nghiệm cá nhân, phải có máu liều, không có kinh nghiệm, nhưng dám học dám làm, dám thử thách bản thân. Không có sự chủ động rất khó hoặc tốn rất nhiều thời gian để học cái mới. Phải trải nghiệm thật nhiều thì mới có kinh nghiệm.
Nhiều bạn học IT ra trường thường bị thụ động do các bạn nghĩ mình đã học đủ và giờ chỉ cần áp dụng vào công việc mà không quan tâm tới những xu hướng mới, cập nhật những công nghệ mới không dám làm những thứ khác ngoài những thứ mình biết. Nên mình tin rằng khi được trui rèn trong môi trường startup, vốn đòi hỏi bản thân phải multi-tasking cũng như nhanh trí giải quyết vấn đề, thì các bạn developer sẽ phát triển rất nhanh cũng như trưởng thành về mặt tinh thần và con người.
Có ý kiến cho rằng thị trường Ecommerce tại Việt Nam đang bị bão hòa và rất khó để nhảy vào anh nhận định như thế nào về ý kiến trên?
Chopp hiện tại có thế mạnh chính bên mảng giao hàng thực phẩm, đặc thù của loại hình này chủ yếu dựa vào thế mạnh dịch vụ. Nói cách khác trải nghiệm của người dùng là tất cả. Trong đó đóng góp của việc ứng dụng hoạt động tốt có thể nói là then chốt. Như vậy cũng thấy được tầm quan trọng của developer như thế nào.
Do Chopp hiện tại chủ yếu làm về service là chính, không chỉ đơn thuần tập trung vào mua bán, mà còn tập trung vào cung cấp dịch vụ, nó liên quan đến người đi mua, cách chọn hàng, dịch vụ cung cấp, đó là điểm khác biêt của Chopp với các E-commerce khác hiện nay (ví dụ như Lazada) vốn chỉ quan tâm vào việc bán được càng nhiều hàng càng tốt. Đối với Choop, online shopping là cả một trải nghiệm dành cho người dùng và đó cũng chính là tôn chỉ hoạt động của bọn mình.
Những bất lợi khi làm E-commerce của Chopp là gì?
Vì Chopp cung cấp rất nhiều sản phẩm tươi sống nên việc đánh giá chất lượng sản phẩm chỉ mang tính chất tương đối, không rõ ràng bởi nó tùy vào cách nhìn nhận của khách. Với một số thì sẽ nghĩ rằng hàng như vậy là ổn nhưng sẽ có những khách đòi hỏi khác. Chính vì vậy, rất khó làm cho khách hàng hài lòng. Chopp luôn đưa ra những phương pháp nhằm bảo đảm cho chất lượng của sản phẩm luôn trong tình trạng tốt nhất có thể khi vận chuyển đến cho khách hàng.
Vấn đề đổi trả hàng cũng là khó khăn chung của các công ty E-commerce hiện giờ, nên cũng không có gì ngạc nhiên khi nó cũng là khó khăn lớn nhất mà Chopp đang gặp phải. Bạn có thể tưởng tượng rằng khi khách đòi trả thì bên Chopp sẽ phải đưa ra những biện pháp giải quyết kịp thời và quan trọng nhất là để đảm bảo khách hàng không bị phiền toái và vẫn hài lòng đối với dịch vụ.
Theo anh Machine learning và cách mạng 4.0 ảnh hưởng như thế nào tới E-commerce?
Để có thể bán hàng thành công thì phải hiểu rõ được người tiêu dùng họ muốn gì cũng như họ cần gì. Và ứng dụng của Chopp phải đưa ra được các recommendation phù hợp để giúp user tiết kiệm thời gian và tiếp cận được vật hàng đúng ý họ. Vì thế mà machine learning sẽ đóng vai trò rất quan trọng.
Việt Nam có nguồn nhân lực phát triển AI, machine learning rất tốt thậm chí không thua kém các nước trên thế giới. Nhưng hiện tại rào cản lớn nhất khiến lĩnh vực machine learning, AI ở Việt Nam vẫn còn chưa phát triển được là do không tạo ra được các sản phẩm ứng dụng giải quyết các vấn đề thực tiễn. Nhưng tiềm năng của dev Việt Nam là rất tốt. Có thể nhiều bạn sẽ ngạc nhiên nhưng nước mình nhiều tài năng lắm đấy. Đây cũng là nguyên nhân khiến Việt Nam trở thành một thị trường tiềm năng cho các công ty Outsourcing phát triển. Tuy vậy, thật đáng tiếc là dù tiềm năng deverloper của nước mình rất lớn nhưng lại bị thiếu hụt về mảng kĩ năng mềm, ví dụ như kỹ năng giao tiếp & làm việc nhóm.
Một vấn đề khá lớn mà nhiều bạn mắc phải là “chỉ biết những gì mình biết, không biết những gì mình không biết”- “bạn phải biết cái gì mình không biết” có như vậy mới biết cần phải học hỏi thêm điều gì.
Vừa qua, chuyên trang tuyển dụng IT – TopDev đã công bố báo cáo về mức lương, phúc lợi và xu hướng ngành IT Quý 1&2 năm 2017. Báo cáo được thực hiện dựa trên khảo sát hơn 5500 ứng viên IT cả nước cùng hơn 150 nhà tuyển dụng, kết hợp với phân tích Database sẵn có của Topdev trong vòng 3 năm trở lại đây. Qua đó cung cấp bức tranh toàn cảnh về thị trường tuyển dụng IT hiện nay và đưa ra những dự báo xu hướng tuyển dụng trong nửa cuối năm.
Cần nhiều nhân lực hơn trong những năm tới
Câu chuyện “khát” nhân lực IT luôn là câu chuyện gây đau đầu cho rất nhiều doanh nghiệp. Trước đó, các chuyên gia phân tích đã từng đưa ra cảnh báo về sự thiếu hụt nhân lực cho ngành IT: “Việt Nam cần khoảng 500 000 nhân lực ngành CNTT vào năm 2020, nhưng theo tính toán, trong khi toàn bộ hệ thống cung cấp nhân lực về CNTT trên cả nước chỉ có khả năng đáp ứng quá nửa con số ấy.”
Một trong những đặc điểm đáng ghi nhận của thị trường công nghệ Việt Nam là khả năng tăng trưởng nhanh. Trong báo cáo ông Nguyễn Hữu Bình – CEO của TopDev cũng khẳng định: “Trong thời điểm hiện tại, ngành IT tại Việt Nam được đánh giá là ngành mũi nhọn, một điểm đến lý tưởng cho những công ty công nghệ hàng đầu trên thế giới”.
Hiện nay, Việt Nam vẫn đang được coi là thiên đường của outsourcing nhưng những năm gần đây đã có sự chuyển mình. Thị trường công nghệ Việt Nam ghi nhận những bước chuyển mình quan trọng, từ chủ yếu là từ mô hình outsourcing sang cung cấp sản phẩm và các dịch vụ đa ngành nhiều hơn. Với mặt bằng công nghệ, trình độ kỹ thuật, tay nghề của cả nước dần được cải thiện thì đó là hướng đi đúng đắn và được dự báo sẽ tiếp tục phát triển trong tương lại.
Chỉ trong vòng 4 năm trở lại đây, số lượng việc làm ngành IT gia tăng mạnh mẽ, nhu cầu tuyển dụng IT tăng dần đều qua các năm. Đặc biệt, năm 2016 tăng 45% so với cùng kỳ năm 2012, và dự báo đến năm 2018 thị trường tuyển dụng IT cần tới 350 000 lập trình viên tức tăng gấp 20 lần so với năm 2016. Trong khi đó, hiện tại chúng ta chỉ mới đáp ứng được khoảng 200 000 lập trình viên, tương đương thị trường đang thiếu khoảng 150 000 lập trình viên. Tuy nhiên nhiều chuyên gia nhận định rằng đây chỉ là sự thiếu hụt ngắn hạn.
Với sự mất cân bằng giữa nguồn cung và cầu của các lập trình viên (LTV) có chất lượng, “cuộc chiến” thu hút, giữ chân nhân tài CNTT giữa các công ty ngày càng gay gắt hơn. Một số các công ty công nghệ sẵn lòng trả mức lương cao hơn so với thị trường và cam kết tăng tới 20% lương cho các ứng viên có 2 năm kinh nghiệm đi kèm với đó là các phúc lợi ưu đãi khác. Thậm chí với các lập trình viên có nhiều năm kinh nghiệm trong những lĩnh vực “hot” như Cloud Computing, Big Data hay AI có thể dao động từ $1000 – $1500 (tùy theo năng lực và vị trí đảm nhận).
Tuy nhiên, dường như bài toán giữ chân nhân tài của các doanh nghiệp vẫn còn lắm khó khăn, khi mà có tới 42% LTV được hỏi muốn nhảy việc. Lý do phổ biến nhất mà các LTV đưa ra là có tới 35% không hài lòng với mức lương hiện tại. Nhưng đây không phải là lý do chính, yếu tố ảnh hưởng nhiều nhất tới quyết định đi hay ở của LTV đa phần là vì không hài lòng với phúc lợi của công ty và sự thiếu hụt những chính sách đào tạo giúp họ có thể nâng cao trình độ chuyên môn. Theo khảo sát, các nhân viên cảm thấy được tôn trọng và muốn gắn bó với công ty lâu dài hơn khi công ty có các chính sách phúc lợi phù hợp, đặc biệt là ở mảng đào tạo.
Thông thạo Javascript luôn là lợi thế cho lập trình viên
Về yêu cầu tuyển dụng, số liệu của TopDev cho thấy: Java, SQL, CSS, và Javascript là những kỹ năng được nhà tuyển dụng săn đón và sẵn sàng trả lương cao nhất.
Đặc biệt đáng chú ý là nhu cầu về Javascript tăng mạnh, các nhà tuyển dụng đánh giá cao các ứng viện thông thạo Javascript và biết nắm bắt các framework hỗ trợ khác. Mặc dù Javascript còn tồn tại rất nhiều nhược điểm như không có trình biên dịch riêng, có thể làm ứng dụng web trở nên nặng nề hơn, bảo mật kém… Tuy nhiên, với những ưu điểm không thể phủ nhận là hoàn toàn miễn phí và dễ sử dụng, Javascript gần như là 1 yêu cầu không thể thiếu trong lập trình web front-end và đang tấn công sang cả back-end và nền tảng di động. Điều đó lý giải tại sao nhà tuyển dụng ngày càng “ưu ái” Javascript hơn. Bên cạnh Javascript đang dẫn đầu xu thế công nghệ thế giới, Big Data, Internet of Things (IoT), Docker, điện toán đám mây và an ninh mạng cũng đang là các xu hướng mà các lập trình viên hướng tới. Những công nghệ này góp phần tối ưu hoá những sản phẩm hiện có của doanh nghiệp.
Từ 7000 khóa học của Class Central, tác giả đã rút gọn lại 460 khóa học hay nhất, đánh dấu thứ hạng và theo từng cấp độ Beginner, Intermediate và Advanced để người đọc dễ tham khảo.
“Một đe dọa có thật là chỉ một số ít quốc gia sẽ thắng cuộc và thu về tất cả”.
Tại Hội nghị châu Á-Thái Bình Dương về Khai phá Dữ liệu cuối tháng 5 vừa qua, khi bàn về cách mạng công nghiệp lần thứ tư, nhận định của giáo sư Sang Kyun Cha – nhà khoa học rất uy tín trong cả hai giới hàn lâm và công nghiệp Hàn Quốc – đã làm tôi bần thần.
Nếu nhận định này là đúng, thì một số ít quốc gia thắng cuộc sẽ là ai? Là các nước G7? Là ai nữa trong các nước G20? Việt Nam có nằm trong số đông các nước sẽ thua cuộc không? Nếu có thì làm sao vượt ra?
Là nước nông nghiệp đang phát triển và đã dựa nhiều vào tài nguyên thiên nhiên đang cạn dần, ta chừng mực nào đó đã đi theo và dùng được thành quả của ba cuộc cách mạng công nghiệp đã qua.
Lưới điện của hơn một thế kỷ trước nay đã đến hầu hết mọi làng xóm xa xôi của đất nước. Máy tính cá nhân, Internet và thiết bị điện tử đã phổ biến rất nhanh dù ta không sản xuất ra chúng. Nhìn chung, ta mới là người tiêu dùng và chưa tham gia được vào việc tạo ra sản phẩm công nghiệp trong các cuộc cách mạng công nghiệp đã diễn ra. Sản xuất của ta lúc này vẫn phần nhiều là những việc các nước G7, G20 đã ngừng để theo đuổi các sản xuất có hàm lượng khoa học và giá trị cao hơn.
Cốt lõi của cách mạng công nghiệp lần thứ tư là sản xuất thông minh dựa trên các đột phá của công nghệ số. Có thể hiểu công nghệ số gồm hai nội dung chính: số hoá và dùng dữ liệu số hoá. Tiến bộ của khoa học đã cho phép con người dần số hoá được hầu hết mọi thực thể trên đời (hệ gien người, cây lúa, chiếc ôtô, khách sạn, doanh nghiệp, cơ quan công quyền…), và trên Internet con người có thể kết nối các thực thể với nhau nhờ các phiên bản số của chúng (Internet vạn vật). Việc kết nối này thực chất là kết nối dữ liệu của các thực thể và do đó tạo ra một không gian dữ liệu số hoá của các thực thể rất lớn và rất phức tạp, hiện vượt quá khả năng xử lý của con người, gọi là hiện tượng dữ liệu lớn (big data).
Mối đe dọa giáo sư Sang Kyun Cha nói đến chính là chỉ một số ít quốc gia làm chủ được công nghệ số và sẽ thắng trong cuộc cách mạng công nghiệp vừa bắt đầu.
Trong vài năm qua, các nước phát triển đều xây dựng chương trình chiến lược quốc gia cho sự phát triển của mình trong những thập kỷ tới, và nội dung công nghệ, phần cốt lõi của các chương trình, chính là câu chuyện của số hoá, kết nối và phân tích dữ liệu lớn. Xuyên suốt ba khía cạnh công nghệ này chính là khoa học dữ liệu.
“Thế giới sẽ là dữ liệu. Tôi nghĩ đây mới chỉ là khởi đầu cho thời đại dữ liệu” – Jack Ma, người sáng lập công ty thương mại điện tử lớn nhất thế giới, tuyên bố. Tiến sĩ Yoram Singer, người phụ trách nhóm nghiên cứu lý thuyết của công ty Google – bây giờ là công ty có giá trị vốn hóa lớn nhất thế giới dưới tên Alphabet – trong lần đến làm việc ở Việt Nam năm 2014 đã khẳng định về bản chất Google là một công ty về học máy (machine learning). Học máy và thống kê toán học, hai thành phần chính của khoa học dữ liệu, nhằm vào việc phân tích dữ liệu, đặc biệt những nguồn dữ liệu rất lớn và phức tạp.
Nếu phân tích được dữ liệu về nhu cầu thị trường, ta có thể quyết định cần nuôi bao nhiêu lợn mỗi nơi mỗi lúc. Nếu phân tích được dữ liệu mô phỏng các phương án xả lũ vào mùa mưa, ta có thể chọn được cách xả lũ ít thiệt hại nhất. Nếu phân tích được các bệnh án điện tử của người bệnh, ta có thể biết khi uống thuốc những hiệu ứng phụ nào có thể xảy ra. Amazon đã phân tích các lần mua hàng trước của bạn để gợi ý bạn mua những món đồ thích hợp…
Những thách thức của đời sống mà chúng ta gặp trên báo chí hàng ngày, đều có thể giải quyết một phần bằng khoa học dữ liệu.
Các nước quanh ta như Singapore, Hàn Quốc, Trung Quốc… trong hai ba năm qua đều thúc đẩy nhiều chương trình nhằm đưa khoa học dữ liệu thành thế mạnh của họ, để họ thành “người thắng cuộc” trong những thập kỷ đang tới.
Nhìn trên thực trạng của bức tranh toàn cầu, nếu không duy ý chí thì có thể nói Việt Nam khó nằm trong số ít thắng cuộc, nhưng có thể nói ta có những yếu tố để làm được và dùng được khoa học dữ liệu một cách hiệu quả, rộng hơn là công nghệ số, cho những mục tiêu phát triển của đất nước.
Giáo dục toán học của ta có truyền thống. Ta có lực lượng làm về công nghệ thông tin khá đông đảo và có kỹ năng tốt. Quan trọng hơn cả, ta có những thế hệ người trẻ tuổi thông minh, khát vọng vươn lên cho đời mình và cho đất nước. Trong khoá học ngắn hạn về khoa học dữ liệu do Viện nghiên cứu cao cấp về Toán (VIASM) tổ chức giữa tháng 5 vừa qua ở hai đầu đất nước, đã có hơn một nghìn người đăng ký và tham gia. Phần lớn họ còn trẻ. Tôi cảm nhận được khát khao hiểu biết và mong muốn vươn lên trên từng khuôn mặt và trong từng câu hỏi của người học.
Trong những năm qua, một số nhà nghiên cứu người Việt làm việc ở đại học và các công ty lớn trên thế giới đã và đang nắm bắt được cũng như tham gia vào giải quyết những bài toán thời sự nhất, khó khăn nhất của khoa học dữ liệu. Với những gì tôi biết, phần lớn trong số họ đều sẵn sàng và mong muốn được học hỏi cũng như chia sẻ kinh nghiệm và hiểu biết của mình với đồng nghiệp trong nước.
Câu nói của giáo sư Sang Kyun Cha hẳn sẽ khiến nhiều người nhớ đến ca khúc nổi tiếng của ban nhạc ABBA: “The winner takes it all” – Kẻ thắng lấy tất. Và tôi muốn biên dịch câu đó, thành: “Được ăn cả, ngã về không”.
Bạn đang theo đuổi con đường trở thành lập trình viên nhưng vẫn chưa thật sự hiểu hết về Frontend, Backend và Fullstack. Cùng TopDev giải đáp thắc mắc về những công việc này qua bài viết sau đây để hiểu về sự khác biệt giữa front end, back end và full stack developer.
Khái quát về Frontend
Phần front-end của một trang web là phần tương tác với người dùng. Tất cả mọi thứ bạn nhìn thấy khi điều hướng trên Internet, từ các font chữ, màu sắc cho tới các menu xổ xuống và các thanh trượt, là một sự kết hợp của HTML, CSS, và JavaScript được điều khiển bởi trình duyệt máy tính của bạn.
Một lập trình viên front-endlà người chịu trách nhiệm thiết kế nội thất của ngôi nhà đã được xây dựng bởi một lập trình viên back-end.
Các kỹ năng và công cụ cần biết khi làm Frontend
Các lập trình viên front-end chịu trách nhiệm cho giao diện của một trang web và kiến trúc những trải nghiệm của người dùng. Để thực hiện được những mục tiêu đó, các lập trình viên front-end phải tinh thông 3 ngôn ngữ chính: HTML, CSS, và ngôn ngữ lập trình JavaScript.
Ngoài việc thông thạo các ngôn ngữ đó, các lập trình viên front-end cần phải làm quen với các framework như Bootstrap, Foundation, Backbone, AngularJS, và EmberJS, để đảm bảo nội dung luôn hiển thị tốt trên mọi thiết bị khác nhau, và các thư viện như jQuery và LESS, đóng gói code vào trong một hình thức giúp tiết kiệm thời gian và hữu dụng hơn.
Rất nhiều công việc dành cho lập trình viên front-end cũng yêu cầu kinh nghiệm với Ajax, một kỹ thuật được sử dụng rộng rãi bằng cách dùng JavaScript để cho phép các trang load một cách tự động bằng cách tải dữ liệu máy chủ ở phần background.
Sử dụng những công cụ này, các lập trình viên front-end làm việc chặt chẽ với các designer hoặc nhà phân tích trải nghiệm người dùng để biến những mockup, hoặc wireframe, từ phát triển tới sản phẩm thực tế.
Các lập trình viên front-end giỏi cũng có thể xác định chính xác các vấn đề cụ thể trong trải nghiệm của người dùng, cung cấp các khuyến nghị và giải pháp hệ thống hóa để ảnh hưởng đến thiết kế đó. Một điều quan trọng là họ có khả năng hợp tác với những nhóm khác trong công ty để hiểu rõ mục đích cụ thể, nhu cầu và cơ hội, và sau đó thực hiện theo những chỉ dẫn đó.
Nói chung, một lập trình viên front-end chịu trách nhiệm cho thiết kế nội thất của một ngôi nhà đã được xây dựng bởi một lập trình viên back-end. Các hương vị và phong cách trang trí được quyết định bởi chủ nhà. Theo Greg Matranga, Giám đốc tiếp thị sản phẩm tại Apptix, nói về cả hai nhóm lập trình viên front-end và back-end mà ông giám sát, “Các lập trình viên làm việc trên front-end đôi khi hào hứng nhiều hơn về những gì họ làm bởi vì họ thực sự có thể tận dụng khả năng sáng tạo của mình.”
Junior (0-2 năm kinh nghiệm): 10,000,000 – 15,000,000 VND/tháng
Mid-level (2-5 năm kinh nghiệm): 15,000,000 – 25,000,000 VND/tháng
Senior (Trên 5 năm kinh nghiệm): 25,000,000 – 35,000,000 VND/tháng
Trên Thế giới
Junior: 50,000 – 70,000 USD/năm
Mid-level: 70,000 – 100,000 USD/năm
Senior: 100,000 – 130,000 USD/năm
Cơ hội việc làm Front-end Developer
Tăng trưởng việc làm: Ngành phát triển web, bao gồm Front-end Development, đang trải qua một giai đoạn tăng trưởng mạnh mẽ. Theo báo cáo của Bureau of Labor Statistics, việc làm trong lĩnh vực phát triển web dự kiến sẽ tăng trưởng 8% từ năm 2020 đến 2030, nhanh hơn mức trung bình của tất cả các nghề nghiệp khác.
Cơ hội việc làm tại Việt Nam: Với sự phát triển nhanh chóng của công nghệ và nhu cầu cao về các ứng dụng web và di động, cơ hội việc làm cho Front-end Developers tại Việt Nam đang gia tăng. Các công ty công nghệ, start-ups, và doanh nghiệp truyền thống đều đang tìm kiếm các lập trình viên có kỹ năng Front-end.
Backend là gì? Thế nhưng điều gì giúp phần front-end của một trang web có thể hoạt động được? Tất cả dữ liệu sẽ được lưu trữ ở đâu? Đó là phần việc của back end. Phần back end của một trang web bao gồm một máy chủ, một ứng dụng, và một cơ sở dữ liệu. Một lập trình viên back-end xây dựng và duy trì công nghệ mà sức mạnh của những thành phần đó, cho phép phần giao diện người dùng của trang web có thể tồn tại được.
Các kỹ năng và công cụ cần biết khi làm Backend
Để khiến cho máy chủ, ứng dụng, và cơ sở dữ liệu có thể giao tiếp được với nhau, các lập trình viên back-end sử dụng các ngôn ngữ server-side như PHP, Ruby, Python, Java, và .Net để xây dựng một ứng dụng, và các công cụ như MySQL, Oracle, và SQL Server để tìm kiếm, lưu trữ, hoặc thay đổi dữ liệu và phục vụ trở lại tới người dùng trong phần front-end. Các công việc tuyển dụng lập trình viên back-end cũng thường yêu cầu kinh nghiệm về các framework PHP như Zend, Symfony, và CakePHP; có kinh nghiệm với các phần mềm quản lý phiên bản như SVN, CVS, hoặc Git; và kinh nghiệm với Linux trong việc phát triển và triển khai hệ thống.
Các lập trình viên backend sử dụng những công cụ này để tạo ra hoặc đóng góp vào các ứng dụng web với code sạch, portable, và được viết tài liệu chu đáo. Nhưng trước khi viết code, họ cần phối hợp với bên liên quan về nghiệp vụ để hiểu những nhu cầu cụ thể, sau đó chuyển thành những yêu cầu kỹ thuật và đưa ra các giải pháp hiệu quả nhất cho việc kiến trúc công nghệ.
Một ví dụ để hình dung công việc của Back-end, khi bạn nhập thông tin để đăng nhập vào một hệ thống, ví dụ như trang tuyển dụng IT TopDev, thì backend có nhiệm vụ nhận yêu cầu đăng nhập từ frontend, sau đó kiểm tra dữ liệu đăng nhập, đảm bảo rằng thông tin từ frontend đã được gửi đúng cách và không có lỗi. Tiếp theo, Backend truy vấn cơ sở dữ liệu để kiểm tra xem tên người dùng có tồn tại không, so sánh mật khẩu nhập vào với mật khẩu đã được mã hóa lưu trữ trong cơ sở dữ liệu. Nếu mật khẩu đúng, backend tạo một token phiên làm việc (session token) hoặc JSON Web Token (JWT) để xác nhận danh tính người dùng và cấp quyền truy cập. Nếu mật khẩu sai, backend gửi phản hồi lỗi tới frontend thông báo rằng thông tin đăng nhập không chính xác.
Mức lương theo cấp bậc Back-end Developer
Mức lương của backend developer tại Việt Nam 2024 dao động từ 10 triệu VNĐ cho cấp Fresher đến 90 triệu VNĐ cho cấp Lead/Manager. Dưới đây là mức lương chi tiết:
Cấp Bậc
Mức Lương Trung Bình (VNĐ/Tháng)
Fresher
10,000,000 – 15,000,000
Junior
15,000,000 – 25,000,000
Mid-Level
25,000,000 – 40,000,000
Senior
40,000,000 – 60,000,000
Lead/Manager
60,000,000 – 90,000,000
Cơ Hội Việc Làm
Do sự chuyển đổi số và nhu cầu mở rộng hệ thống IT, nhu cầu về các kỹ sư backend có kỹ năng tốt đang tăng cao. Các lĩnh vực như fintech, e-commerce, và các dịch vụ trực tuyến đang tạo ra nhiều cơ hội việc làm. Ngoài ra, Backend developers có thể làm việc cho các công ty công nghệ trong nước, công ty nước ngoài tại Việt Nam, hoặc từ xa cho các công ty quốc tế với mức lương hấp dẫn.
Thường thì không có một sự phân biệt rõ ràng trắng đen giữa phát triển front-end và back-end. “Các lập trình viên front-end thường cần phải tìm hiểu thêm những kỹ năng back-end, và ngược lại, đặc biệt là trong giai đoạn kinh tế hiện nay,” Matranga nói. “Các lập trình viên cần phải có nhiều kỹ năng khác nhau và có kiến thức tổng hợp.” Vậy lập trình viên fullstack là gì?
Fullstack = Front-end + Back-end
“Làm việc chuyên nghiệp trên cả server side và client side mở ra nhiều cơ hội,” Federico Ulfo, một lập trình viên full stack tại công ty Grovo nói. Nhưng, dĩ nhiên, phát triển full stack không phải là không có những thách thức của nó. “Để làm ra một món ăn ngon, bạn có thể giỏi nấu hoặc giỏi nướng, nhưng để làm chủ cả hai kỹ năng này thì cần có thời gian và kinh nghiệm. Và tôi không nói về việc cứ làm theo một công thức nào đó, vì bất kỳ ai cũng có thể làm như vậy. Tôi đang nói về việc có các thành phần nguyên liệu để chuẩn bị cho một cái gì đó thực sự tốt.”
Các lập trình viên full stack làm việc giống như các lập trình viên back-end ở phía máy chủ của lập trình web, nhưng họ có thể cũng thành thạo các ngôn ngữ front-end để điều khiển nội dung trông như thế nào ở phía giao diện của trang web. Họ là những người đa năng.
Bất kể là sử dụng công cụ xác định nào, tùy thuộc vào dự án và khách hàng, các lập trình viên full stack nên có kiến thức ở mọi cấp độ về cách web hoạt động: cài đặt và cấu hình các máy chủ Linux, viết các API server-side, nhảy vào phần JavaScript client-side của một ứng dụng, và cũng cần có “con mắt thẩm mỹ” với CSS.
Sử dụng những công cụ này, các lập trình viên full stack cần có khả năng ngay lập tức xác định trách nhiệm của client-side hay server-side, và trình bày rõ ràng về mặt ưu nhược điểm của các giải pháp khác nhau.
Ví dụ, một lập trình viên full stack sẽ chịu trách nhiệm cho toàn bộ luồng trải nghiệm của bạn với bài viết blog này, từ thời gian tải và bố cục cho tới tính tương tác và cấu trúc của nó.
Mức lương theo cấp bậc Fullstack Developer
Dưới đây là bảng so sánh mức lương trung bình của Fullstack Developer tại Việt Nam và trên thế giới trong năm 2024:
Việt Nam
Thế Giới
Fresher
12 – 18 triệu VNĐ/tháng
Junior
18 – 30 triệu VNĐ/tháng
$60,000 – $80,000 USD/năm
Mid-Level
30 – 50 triệu VNĐ/tháng
$80,000 – $110,000 USD/năm
Senior
50 – 80 triệu VNĐ/tháng
$110,000 – $150,000 USD/năm
Lead/Manager
80 – 120 triệu VNĐ/tháng
$150,000 – $200,000 USD/năm
Cơ Hội Việc Làm Fullstack Developer
Cơ hội việc làm cho Fullstack Developers trong năm 2024 rất tích cực và đang có xu hướng tăng trưởng mạnh mẽ do nhu cầu cao từ các công ty công nghệ và startups. Các công ty quy mô nhỏ và vừa có xu hướng tìm kiếm các nhà phát triển có khả năng làm việc ở cả hai phía frontend và backend để tiết kiệm chi phí nhưng vẫn đáp ứng vận hành công ty. Các nhà phát triển Fullstack thường có nhiều cơ hội làm việc từ xa hoặc freelance, nhờ vào sự linh hoạt của công việc và nhu cầu từ các công ty toàn cầu.
So sánh Frontend, Backend và Fullstack
Dưới đây là bảng phân biệt giữa các vai trò Frontend, Backend và Fullstack trong phát triển phần mềm:
Kết hợp các công cụ và thư viện của cả Frontend và Backend
Công việc chính
Tạo và tối ưu hóa giao diện người dùng, đảm bảo trải nghiệm người dùng mượt mà.
Xây dựng và duy trì cơ sở dữ liệu, API, xử lý logic ứng dụng, bảo mật.
Phát triển cả frontend và backend, quản lý toàn bộ chu trình phát triển phần mềm.
Kỹ năng cần có
Thiết kế giao diện, CSS, Responsive design, JavaScript Frameworks.
Cơ sở dữ liệu, lập trình máy chủ, API, bảo mật
Kỹ năng của cả Frontend và Backend, khả năng tích hợp và quản lý dự án
Tóm lại, mỗi vai trò đều đóng góp một phần quan trọng trong việc phát triển và duy trì ứng dụng hoặc hệ thống. Frontend Developer mang lại trải nghiệm người dùng tốt nhất, Backend Developer đảm bảo hệ thống hoạt động ổn định và hiệu quả, trong khi Fullstack Developer kết hợp cả hai để tạo ra một giải pháp hoàn chỉnh. Qua bài viết của TopDev hi vọng có thể giúp bạn có được những quyết định đúng đắn hơn trong việc lựa con đường phát triển sự nghiệp trong sự nghiệp IT của mình.
Điều tốt nhất về ngành lập trình viên hiện đại là chúng ta sở hữu rất nhiều nguồn tài nguyên sẵn có. Và đó cũng là điều tồi tệ nhất.
Cũng giống như tôi, bạn được tận hưởng thành quả của sự phát triển hiện đại. Dù cho bạn đã từng có kinh nghiệm từ trước đây hay chưa thì thực tế là bạn vẫn có thể lên mạng để học các kỹ năng trở thành developer, có được việc, trở thành 1 freelancer, hoặc khởi nghiệp bằng cách xây dựng 1 star-up
Lúc còn nhỏ, ai đó đã tặng tôi một thẻ quà tặng. Tôi dành khoảng 1 tiếng vừa đi bộ vừa suy nghĩ về cách sử dụng thẻ quà tặng, sau đó tới cửa hàng và mua thứ tốt nhất ở đó. Tuy vậy, rất nhiều lần, tôi đã không thực sự có được thứ mà mình muốn dù nếu kiên nhẫn hơn, tôi đã có thể nhận được một thứ gì đó tốt hơn. Tuy nhiên, tôi cảm thấy muốn mua một cái gì đó ngay lập tức và thường thất vọng.
Cảm giác đó giống như khi bạn cố gắng học để trở thành developer hiện đại. Có rất nhiều điều tuyệt vời để học hỏi và các chủ đề để khám phá, nhưng có rất ít thời gian trong ngày. Nếu không được xử lý ổn thỏa, điều này có thể dễ dàng dẫn đến sự mệt mỏi.
Một mặt, Modern Development mang lại nhiều cơ hội hơn, mặt khác nó cũng mang lại không ít những khó khăn khi phải lựa chọn nên tập trung vào một bộ kỹ năng cụ thể và khó có thể duy trì được động lực trong những lúc mệt mỏi
Vô tình, tôi đã phát hiện ra một phương pháp cho phép tôi tập trung vào các kỹ năng hiện tại mà tôi đang học và cho tôi nhiều động lực hơn (bao gồm cả khuyến khích tài chính).
Phương pháp kiểm tra dummy (The Test Dummy Method)
Phương pháp The Test Dummy là việc thử nghiệm kỹ năng mới và tạo nội dung về những điều đang học.
Hãy để tôi giải thích kĩ hơn về điều này bằng câu chuyện của tôi về cách tôi vô tình phát hiện ra phương pháp này và những lợi ích mà nó mang lại.
Câu chuyện của tôi
Tôi tốt nghiệp vào tháng 12 năm 2015 với bằng về Khoa học Máy tính. Tôi đã học các nguyên tắc cơ bản của C + +, Java, và một chút về phát triển các trang web lỗi thời.
Mặc dù có bằng tốt nghiệp để thêm vào CV xin việc nhưng tôi vẫn chưa có ý tưởng gì về việc tập trung phát triển kỹ năng nào hay sẽ làm công việc gì.
Tôi tìm kiếm sự giúp đỡ từ các trang về công nghệ, cho đến khi tôi có được một công việc developer.Vào ngày đầu tiên đi làm tôi phải làm công việc vặn bóng đèn bắt đầu cho những chuỗi ngày thất vọng.
Cũng trong khoảng thời gian này, tôi tham gia vào kinh doanh podcast. Điều này khiến tôi quan tâm đến web developer hiện đại vì tôi quan tâm đến các công ty startup mà chúng tôi cung cấp các ứng dụng web. Tôi cũng đã nhận được những lời khuyên về tạo ra sản phẩm dựa trên niềm đam mê và kỹ năng của bạn.
Khi mối quan tâm về web development của tôi ngày càng tăng lên, tôi đã quyết định cố gắng học React trong thời gian rãnh của mình
Chỉ trong thời gian ngắn, tôi mệt mỏi và muốn bỏ cuộc. Dưới đây là một cuộc nói chuyện được thực hiện để tóm tắt những khó khăn mà tôi gặp phải:
Tài liệu trực tuyến (Online Resources): React là những gì bạn muốn tập trung vào để tạo giao diện người dùng cho các ứng dụng web hiện đại.
Tôi: Nghe có vẻ thật tuyệt, những gì tôi cần là bắt đầu 1 project React mới
OR: Vâng. Chúng tôi có thể khởi tạo dự án của chúng tôi với npm. Sau đó, chúng ta chỉ cần cài đặt và cấu hình Webpack và Babel, chúng ta có thể viết trong ES6instead của ES5. Sau đó, chúng ta có thể cài đặt React và ReactDOM để có thể bắt đầu viết mã với React.
Tôi: ES6 là cái gì? Tại sao chúng ta cần phải sử dụng webpack và Babel. Đồng thời cả React và React Dom đều sử dụng React? Có lỗi đánh máy gì ở đây không?
OR: ES6 là phiên bản mới của ECMAScript. Nó không được thực hiện tốt trong các trình duyệt nhưng có một số tính năng hay ho mà chúng ta có thể sử dụng. Babel xử lý mã ES6 và làm cho nó tương thích với các trình duyệt hỗ trợ ES5. Chúng ta có thể sử dụng Webpack để đóng gói code của chúng tôi và áp dụng Babel. React là một thư viện nhưng bạn cũng cần cà thư viện ReactDOM để làm cho mọi thứ hoạt động
Tôi: ECMAScript? Tôi nghĩ chúng ta đang nói về JavaScript. Tôi không chắc chắn về tiến trình đóng gói code mà bạn đề cập đến. Bạn biết đấy … điều này có vẻ như rất nhiều việc phải làm chỉ để bắt đầu. Sau tất cả thì lợi ích của React là gì?
OR:Bạn có thể xây dựng một giao diện người dùng bên ngoài các componient đóng gói JSX và data. Nó thực sự mô đun.
Tôi: JSX là gì?
Tôi: Điều đó có vẻ thú vị Chúng ta hãy tiếp tục
OR: Tuyệt vời! Tôi biết bạn có vẻ bối rối về việc tạo một dự án React mới. Đừng lo. Có một bộ starter tuyệt vời trên GitHub được tải bằng Webpack, Babel và Webpack Dev Server , hãy tiếp cận và nhân bản nó ngay thôi
Tôi: Woah. Tôi không hiểu một phần đoạn code này. Tuy nhiên, các componient này trông quen thuộc. Tôi nhận được các componient cơ bản, nhưng tại sao lại phải sắp xếp các componient này?
OR: Oh! Đó chỉ là vì chúng có thể chia ra thành 2 phần : một về giao diện người dùng, 2 là các componient cha mẹ và con cái của chúng. Sau đó, chúng ta có thể truyền dữ liệu giữa họ.
Tôi: Nhưng có nhiều hơn 1 cha mẹ và con! Giống như một ông bvà những đứa cháu và cả dòng họ tổ tiên ở đó nữa. Vậy phải truyền cái gì?
…..
Bạn biết đấy…. bạn không cần phải trả lời điều đó. React rất phổ biến nên nó chắc hẳn đơn giản. Tôi có lẽ quá ngốc khi hỏi rất nhiều câu hỏi. Rõ ràng, tôi không phù hợp để trở thành một developer. Tôi sẽ từ bỏ nỗ lực tìm hiểu về web developer hiện đại.
Sau những lần đấu tranh tư tưởng như thế này, tôi thấy khó có thể cố gắng tiếp tục học phát triển web hiện đại sau một ngày dài làm việc (và tập tạ lúc 5 AM) thay vì chơi PS4.
Tôi đặt React sang 1 bên và chơi Uncharted.
Tuy nhiên, khi tôi nhận thêm công việc thiết kế đồ họa vector trong giờ ăn trưa vì nó làm tôi cảm thấy như giảm stress. Tôi bắt đầu cảm thấy thực sự tốt và tự tin vào kỹ năng mới này
Một ngày nọ, tôi khám phá ra Codepen và bắt đầu tạo ra các hình ảnh CSS thuần túy vì chúng tương tự như đồ hoạ vector mà tôi đang làm.
Tôi bắt đầu tweet về những cây viết mới mà tôi đã làm và nhận được rất nhiều phản hồi tích cực về những kỹ năng nâng cao.
Mặc dù tôi chỉ biết những điều cơ bản về hình ảnh CSS thuần túy và không biết gì về các hoạt hình, SCSS, vv, tôi đã nhận được nhiều phản hồi tuyệt vời. Nó có tác dụng khuyến khích tôi vô cùng hiệu quả
Sau đó, tôi quyết định thử nghiệm Vue.js bằng cách tạo ra một số nội dung thân thiện với hình ảnh trên Codepen.
Sau đó, tôi sẽ viết một bài đăng trên Medium dạy cho mọi người Phương pháp làm thế nào để tạo ra những điều tôi đang làm với Vue.js.
Tôi tập hợp các bài đăng này trong bài viết đăng trên Medium mà tôi gọi nó là Coding Artist.
Tôi đạt được những bước tiến xa hơn trong web developer hiện đại và cuối cùng tạo ra các sản phẩm như là 1 cuốn ebook có tên là React.js cho Visual Learner.
Đó là một câu chuyện dài, cuối cùng tôi đã có thể học những điều mới trong thế giới web development hiện đại mà không gặp phải sự mệt mỏi bằng cách tạo ra nội dung mà tôi đang học.
Tôi đã trở thành một Dummy thử nghiệm. Tôi đã thử nghiệm các kỹ năng mới và sau đó tạo ra nội dung để dạy lại những kỹ năng đó một cách thực tiễn nhất bằng những trải nghiệm của bản thân mình cho mọi người
Bởi vì tôi tạo ra nội dung giảng dạy những gì tôi đang học, tôi đã không bị phân tâm bởi việc học nhảy cóc các kỹ năng khác quá sớm. Tôi cũng có động lực rất lớn để giúp đỡ những người khác học hỏi và nhận được những phản hồi tích cực kết nối với các developer khác và tạo ra các sản phẩm mà tôi có thể bán được.
Bây giờ, tôi muốn đưa ra các bước để thực hiện Implementing the Test Dummy Method.
Điều này có vẻ mâu thuẫn. Một mặt, phương pháp Implementing the Test Dummylà phương pháp giúp những người học không bị lan man không mục đích. Mặt khác, bạn cần phải khám phá kỹ năng nào bạn quan tâm nhất. Làm thế nào bạn có thể cân bằng được cả 2 mặt này.
Bạn vẫn có thể khám phá ra đam mê của bạn mà không cần phải nhảy vào học tất cả các kỹ năng khác nhau, mà thường liên quan đến công việc hiện tại của bạn
Nghiên cứu các kỹ năng khác nhau để trở thành developer hiện đại. Hãy suy nghĩ về cách chúng được ứng dụng trong thế giới hiện đại và những cơ hội nghề nghiệp của nó trong tương lai. Nếu có thể, bạn có thể thử nghiệm nó trên một quy mô rất nhỏ.
Viết ra những ưu- nhược điểm và những câu hỏi liên quan cho đến khi bạn giải quyết được các vấn đề trên. Bạn sẽ biết mình thật sự đam mê điều gì
Bước 2: Học Bite-Sized
Một khi bạn biết mình thật sư đam mê điều gì, bạn có thể bắt đầu học các kỹ năng mới theo phong cách bite-sized fashion
Hãy sử dụng frontend development như một ví dụ. Thay vì cố gắng bắt đầu bằng cách tạo một ứng dụng React động bạn có thể đặt trên Product Hunt (Tôi đã từng nhìn thấy điều này xảy ra), tạo các ứng dụng mini kết hợp các kỹ năng mới mà bạn học được. Trong trường hợp của tôi, tôi tạo ra một đồng hồ Pomodoro khi tôi đang học Vue.js và các ứng dụng mini khác.
Ở giai đoạn này, bạn có thể bắt đầu chia sẻ công việc của bạn trên Twitter và nhận phản hồi từ các developer khác.
Bước 3: Viết bài đăng
Một khi bạn đã bắt đầu học hỏi những kỹ năng mới với đam mê của chính mình, hãy chia sẽ về cách bạn thực hiện nó với mọi người trên Medium
Hãy ghi nhớ cảm giác của bạn khi nổ lực học các kỹ năng mới , những thử thách mà bạn phải đối mặt trong quá trình học. Giữ cho bài viết càng thức tế, càng chi tiết càng tốt
Một bài tốt nên kể một câu chuyện. Dưới đây cách mà tôi thích sử dụng:
Đề cập đến một vấn đề
Kể câu chuyện về cách tôi giải quyết vấn đề
Chỉ cho mọi người cách giải quyết vấn đề
Ở giai đoạn này, chia sẻ bài đăng của bạn trên Twitter.
Bước 4: Tạo sản phẩm
Ở bước này, bạn nên hiểu những điều cơ bản về các kỹ năng mới mà bạn đang học và có được sự tự tin nhất định sau khi chia sẻ sản phẩm và bài đăng của mình.
Tuy nhiên, bạn có thể cân nhắc đến việc áp dụng các kỹ năng vào một project thực tế.
Khi bạn thực hiện kỹ năng của mình và theo đuổi 1 dự án thực tế, bạn có thể tạo ra một sản phẩm dạy cho mọi người toàn bộ quá trình.
Ví dụ: khi tôi có một sự hiểu biết tốt về những điều cơ bản của React bằng cách tạo ra các ứng dụng mini trên Codepen. Tuy nhiên, tôi chưa bao giờ tạo giao diện mô đun riêng của mình. Tôi quyết định viết một cuốn sách điện tử có thể hướng dẫn người mới bắt đầu React thông qua quá trình học những điều cơ bản và sau đó tạo ra một giao diện người dùng kiểu mô-đun từ đầu. Tôi đã phát hành mỗi chương trên Medium.
Bởi vì bạn đang tạo ra một sản phẩm khi bạn đang học, bạn sẽ có một động lực lớn để vượt qua rào cản và không cảm thấy mệt mỏi.
Bạn có thể nghĩ: “Tôi có thể tạo ra sản phẩm gì?”
Đối với các developer sản phẩm tốt nhất là:
Khóa học video
Ebook
Tuy nhiên, bạn có thể sáng tạo hơn và có những sự lựa chọn khác. Theo kinh nghiệm của tôi, tạo ra một ebook dễ dàng hơn và nhẹ nhàng hơn tạo ra một khóa học video.
Đối với ebook tôi đã viết 10 chương và mỗi chương mất 8-20 giờ.
Bước 5: Bán sản phẩm
Nếu bạn đã dành rất nhiều tâm huyết vào sản phẩm của mình và cảm thấy sản phẩm của bạn là rất hữu ích cho cộng đồng developer thì không có gì là sai khi bán nó.
Nếu bạn bán các khóa học video, Teachable là một nơi tốt để bán nó.
Nếu bạn đang bán ebook, tôi thực sự thích sử dụng Leanpub.
Với ebook của tôi, tôi đã tạo ra doanh thu $ 11 trong 3 tuần. Điều đó có vẻ vô cùng nhỏ bé, tuy nhiên, nó có thể bán thụ động, tốt hơn so với doanh thu $ 0 từ các phương pháp tự học thông thường, và nó là một thành tích thực sự ấn tượng để đề cập đến trong các cuộc phỏng vấn xin việc .
Trong tất cả các phương pháp mà tôi đã thử Phương pháp test Dummy là phương pháp hữu ích nhất để trở thành 1 developer tốt hơn không hề mệt nhọc
Sau vài lần trải nghiệm sử dụng app tệ hại mặc dù trước đó nó đã pass được vài bài test do chính mình đặt ra. Tôi quyết định tìm hiểu về integration test React, kèm theo đó là cả Redux và React Router.
Thật đáng kinh ngạc khi hầu như không hề có một nguồn nào tốt cả. Đa phần họ đều sử dụng integration test một cách khập khễnh hoặc là sai hoàn toàn luôn.
Nói cách khác bạn sẽ phải tự tạo ra một integration test để initializes một React component, thay đổi simulated user interaction và assert để component phát triển theo đúng hướng ta muốn.
Tôi sẽ không nói thêm về phần cái đặt những phần mềm trên vì nó có đầy trên mạng rồi.
Để setup cơ bản cho integration test, tôi sẽ dùng vài tiểu xảo và tạo ra một util function như sau:
import { applyMiddleware, combineReducers, createStore } from 'redux';
import thunk from 'redux-thunk';
import { ReactWrapper } from 'enzyme';
import { routerStateReducer } from 'redux-router';
/* Sets up basic variables to be used by integration tests
* Params:
* reducers: should be an object with all the reducers your page uses
* initialRouterState: an optional object to set as the initial state for the router
* Returns:
* an object with the following attributes:
* store: the reducer store which contains the main dispatcher and the state
* dispatchSpy: a jest spy function to be used on assertions of dispatch action calls
*/
export function setupIntegrationTest(reducers, initialRouterState = {}) {
// creating the router's reducer
function routerReducer(state = initialRouterState, action) {
// override the initial state of the router so it can be used in test.
return routerStateReducer(state, action);
}
// creating a jest mock function to serve as a dispatch spy for asserting dispatch actions if needed
const dispatchSpy = jest.fn(() => ({}));
const reducerSpy = (state, action) => dispatchSpy(action);
// applying thunk middleware to the the store
const emptyStore = applyMiddleware(thunk)(createStore);
const combinedReducers = combineReducers({
reducerSpy,
router: routerReducer,
...reducers,
});
// creating the store
const store = emptyStore(combinedReducers);
return { store, dispatchSpy };
}
Testing
Trong thư mục testing, chúng ta sẽ cần import một vài dependencies, reducer và component:
import React from 'react';
import { Provider } from 'react-redux';
import { mount } from 'enzyme';
import myReducer from '../src/reducers';
// make sure to import your connected component, not your react class
import MyComponent from '../src/components/MyComponent'
Sau đó, với beforeEach function, set up variables của integration test nhờ vào util function trên:
(Nếu bạn không có xài React Router hoặc Thunk, bạn có thể remove mấy cái references của nó trong util function và mọi thứ sẽ hoạt động giống như trên)
Giờ thì bạn đã sẵn sàng nạp mấy cái component và test nó. Hãy tưởng tượng có một component với khả năng renders một div và hiển thị tin nhắn text từ reducer. Khi bạn click vào nó, đoạn text đó sẽ biến thành một string mới (new text). Để test quá trình tương tác trên, bạn có thể làm như sau:
it('should change the text on click', () => {
const sut = mount(
<Provider store={store}>
<MyComponent />
</Provider>
);
sut.find('div').simulate('click');
expect(sut.find('div').prop('children')).toEqual('new text');
});
Đơn giản vậy đây, với chỉ những dòng code trên bạn sẽ test div gọi action producer khi có click tương tác của user, cũng như đưa ra một action cho reducer, như thay đổi data, trigger re-render trên component. Nếu có bất kì lỗi nào xảy ra, bài test sẽ báo hiệu màu đỏ cho bạn biết app của mình đã bị error.
Bạn cũng có thể đào sâu hơn về vấn đề trên với cách thức sau:
// To test if the action producer has dispatched the correct action
expect(dispatchSpy).toBeCalledWith({ type: 'DIV_HAS_BEEN_CLICKED' });
// To test if the actual data on the reducer has changed
expect(store.getState().myReducer.divText).toEqual('new text');
Testing API calls
Bạn sẽ cần tới API để lấy data cho app của mình, và đó là nơi mà bạn cần phải kiểm tra theo dõi để bài test diễn ra một cách chính xác. Trong bài viết này, tôi sẽ dùng Jest bởi sự tiện lợi của nó.
Tôi sẽ giả sử rằng chúng ta đang dùng một http client để call một endpoint để lấy function khi bạn click vào div, rồi return call trên về với reducer để có thể hiển thị trở lại trong div:
// to mock a whole imported dependency, do this
jest.mock('my-http-client');
import http from 'my-http-client';
// ...
it('should change the text on click', () => {
http.get.mockImplementation({ body: 'the-return-of-my-get-request' });
const sut = mount(
<Provider store={store}>
<MyComponent />
</Provider>
);
sut.find('div').simulate('click');
expect(sut.find('div').prop('children')).toEqual('the-return-of-my-get-request');
});
Đôi khi trong quá trình lấy function nhưng lại return một Promise object. Đó là bởi click function không nhận ra được promise đó và thế là bị đứng. Khi đó, reference của object đã bị mất.
Như vậy, chúng ta cần phải đợi đến khi nào promise đó tự giải quyết được trước khi có thể executing bước tiếp theo. Giải pháp đưa ra là dùng một mánh khóe với util function:
/* Async function that will finish execution after all promises have been finished
* Usage:
* it('...', async () =. {
* // mount component
* // execute actions
* await flushAllPromises();
* // execute assertions for async actions
* });
*/
export function flushAllPromises() {
return new Promise(resolve => setImmediate(resolve));
}
Và test của chúng ta sẽ trông như thế này đây:
it('should change the text on click', async () => {
http.get.mockImplementation(() => Promise.resolve({ body: 'the-return-of-my-get-request' }));
const sut = mount(
<Provider store={store}>
<MyComponent />
</Provider>
);
sut.find('div').simulate('click');
await flushAllPromises();
expect(sut.find('div').prop('children')).toEqual('the-return-of-my-get-request');
});
Do Jest hiện tại vẫn chưa có cách giải quyết vấn đề trên nên mánh khóe trên tỏ ra khá tiện lợi trong thời điểm hiện tại.
Còn nếu bạn có action producer phức tạp hơn với các promises được gọi bởi do resolve hoặc reject của promise đầu tiên, tôi khuyên bạn nên xài unit test đối với chúng và integration tests cho kết quả cuối cùng.
Vì sao không xài UNIT TEST?!?
Bạn có thể làm quá trình TDD chỉ với integration tests mà kết quả đưa ra vẫn tốt. Mặt khác, integration tests rất hữu ích đối với việc tìm kiếm broken link giữa các app layer cũng như kiểm tra xem app có hoạt động theo mong muốn hay không.
Hơn nữa, unit test chỉ thích hợp đối với những trường hợp phức tạp, còn đa phần các trường hợp khác đều có thể xử lý với intergration tests. Nhờ đó mà quá trình test sẽ trở nên đơn giản, tiết kiệm thời gian.
Ngoài ra một lợi thế lớn khác là với intergration test, bạn sẽ mounting component “Gốc” để kiểm tra xem các component con có hoạt động đúng không. Và cực kì linh hoạt bởi bạn có thể kiểm tra từng component hoặc kiểm tra cả đám cùng một lúc.
Công ty Vihat với slogan “Mobile Solution For Everyone” mang trong mình một tham vọng trở thành một trong những công ty về lĩnh vực công nghệ mobile hàng đầu Việt Nam cũng như vươn ra thế giới với những sản phẩm mang tính thiết thực, chi phí rẻ nhằm tạo điều kiện phát triển cho các doanh nghiệp trong và ngoài nước. Anh Hoàng Quốc Việt –người đồng sáng lập VIHAT, CEO Dự án TeraApp đã có buổi gặp gỡ và trao đổi cùng với TopDev về những suy nghĩ, tâm tư của anh đối với ngành CNTT Việt Nam nói chung và các bạn lập trình viên nói riêng.
1-Anh có thể giới thiệu đôi điều về Vihat được không?
Vihat được thành lập vào năm 2013 với 2 lĩnh vực chính là product và outsourcing. Trong thời gian đầu lúc công ty mới phát triển, VIHAT làm outsource cho một đối tác ở Mĩ và vẫn còn tiếp tục đến giờcũngchỉ 1 dựán Outsourcing, công ty chú trọng vào việc phát triển các ý tưởng thành sản phẩm và kinh doanh sản phẩm đó.
Đến thời điểm hiện tại VIHAT có 3 sảnphẩm: E-SMS cổng tin nhắn marketing với sản lượng hơn 10 triệu tin nhắn 1 tháng. Sản phẩm thứ 2 là E-voice – tổng đài thoại giúp giảm thiểu nhân sự cho tổng đài chăm sóc khách hàng, hoạt động hoàn toàn tự động mà chi phí rất rẻ. Sản phẩm cuối cùng là TeraApp, một công cụ giúp cho doanh nghiệp tạo ra ứng dụng di động mà không cần phải lập trình. TeraApp giúp kết hợp tất cả những khâu phức tạp để tạo ra một ứng dụng mobile như lập trình Anrdoid, iOS, lập trình hệ thống.. thành một bộ công cụ đơn giản hoàn toàn chạy trên Cloud, giúp cho doanh nghiệp không cần phải lo lắng về việc làm thế nào để có một ứng dụng mobile, vận hành nó thế nào mà chỉ tập trung vào việc khai thác ứng dụng để mang lại doanh thu cho doanh nghiệp mình.
2-E-voice nghe có vẻ khá thú vị, có phải nó áp dụng những công nghệ liên quan tới AI hay Chatbot nhỉ? Anh có thể nói thêm được không?
Sản phẩm E-voice của bên VIHAT không giống như Chatbot mà sử dụng các đoạn ghi âm sẵn để trả lời khách hàng. Ví dụ đối với lĩnh vực thương mại điện tử thường đơn hàng khách đặt xong sẽ có bộ phận chăm sóc khách hàng gọi điện trực tiếp cho khách để xác nhận thông tin và giao hàng, việc này rất tốt chi phí và khả năng mở rộng khó khăn. Với Evoice bên mình có thể thực hiện cả ngàn cuộc gọi xác nhận hoàn toàn tự động với chi phí rẻ, doanh nghiệp không cần phải duy trì một đội ngũ chăm sóc khách hàng đồ sộ nữa.
Cụ thể như những đoạn hội thoại “đơn hàng của bạn có giá trị là….” Sẽ được ghi âm sẵn để trả lời, hệ thống cho phép truyền tham số như giá tiền để tự động đọc, người dùng cuối khi đó sẽ nghe được 1 đoạn câu hỏi như sau “Đơn hàng của bạn đã đặt tại hệ thống VIHAT chúng tôi với gía trị là 500.000vnđ, bạn có chắc chắn nhận đơn hàng này không, nhấn phím 1 để xác nhận lấy đơn hàng”. Sau đó hệ thống sẽ thu thập hành vi của người dùng rồi gửi lại cho đối tác để xác định đơn hàng đó có được xác thực hay không.
3-Từ quá trình xây dựng Vihat, anh có thể chia sẻ những bài học một số bài học kinh nghiệm khi khởi nghiệp?
Từ trước thời điểm Vihat ra đời, mình với Hà (co-founder) là bạn học thời cấp 3, lên đại học cũng là đồng môn tại Bách Khoa HCM. Bọn mình từng cộng tác nhiều dự án một trong số đó là dự án mạng xã hội bản đồ KunKun được giải nhất mùa hè sáng tạo 2008 do Qualcomm và hội tin học Việt Nam tổ chứcsau đó được Viettel mời vào tiếp tục phát triển dự án đó vào năm 2009. Nhưng rất tiếc sản phẩm không thành công nên quyết định rời Viettel vào 2013 và ra làm Startup riêng. Như vậy, Vihat ra đời.
Trước mình có nói về 3 sản phẩm đang làm nhưng từ khi thành lập VIHAT bên mình cũng có một dự án tiền thân nữa nhưng không may thất bại. Đó là một mạng xã hội sự kiện dành cho mobile – Whatshot, mất gần một năm để hoàn thành với chỉ 2 người. Tuy nhiên sau 6 tháng triển khai thì thất bại. Lúc đó bản thân rút ra 2 bài học lớn: 1 là do Whatshot xuất hiện chưa đúng thời điểm. Bởi 2013, thì vẫn còn rất ít người dùng Smarphone nói riêng và ứng dụng Mobile nói chung để tra cứu, để xem nó là một phần cuộc sống như hiện tại , thứ 2 là bọn mình lúc đó thấy ý tưởng đó hay tuy nhiên mình chưa có một kinh nghiệm gì trong ngành sự kiện, mình chưa hiểu một sự kiện được tổ chức vận hành như thế nào nên không lường trước được các vấn đề phát sinh khi triển khai, không kết nối được các ông chủ sự kiện để tạo nguồn dữ liệu cho ứng dụng… Thất bại khi nguồn tài chính của mình cạn mà chưa có lời giải cho doanh thu/ chi phí.
Trong quá trình đi tiếp xúc những ông chủ sự kiện, phòng trà thì nhận thấy họ có nhu cầu gửi tin nhắn để quảng bá rất nhiều, đó chính là lúc bọn mình nghỉ tới làm 1 sản phẩm giúp phòng trà marketing bằng E-SMS. Vậy là mình với Hà bắt tay vào làm, lúc sơ khai hệ thống mình đơn sơ chỉ có một cục modem để nhắn cho khách chưa có hệ thống phần mềm hỗ trợ, mọi việc rất cực, rồi dần dần tụi mình có khách, có doanh thu , đầu tư nhiều hơn về hệ thống, về chiến thuật cho sản phẩm và kinh doanh để được như ngày hôm nay.
Sản phẩm E-SMS thành công bởi vì xuất phát từ nhu cầu thực của khách hàng. Đó là bài học kinh nghiệm của VIHAT. Sau đó, có nhiều khách nhờ tạo cho họ ứng dụng bởi họ biết VIHAT làm về mobile marketing là một công ty công nghệ. “Một doanh nghiệp hỏi thì không sao nhưng cả chục doanh nghiệp hỏi thì liệu đó có phải là xu hướng không?”. ThếlàTeraApp ra đời từ đây.
4-Vậy với những sản phẩm như vậy, Anh có đòi hỏi gì đặc biệt khi tuyển dụng nhân sự? Với các bạn lập trình viên thì ngoài những kĩ năng cơ bản thì Vihat còn có yêu cầu gì khác không?
Về mặt tuyển dụng, VIHAT có tiêu chí tuyển dụng có thể không giống như những đơn vị khác. VIHAT không quá quan trọng về kinh nghiệm đầu vào, khi tuyển dụng mình thường đánhgiáxem tinh thần và thái độ của ứngviên có thể cống hiến cho công ty lâudàiđược hay không. Nhiều bạn trong Vihat không có xuất phát điểm từ lập trình nhưng vẫn có vị trí cao, công ty sẵn sàng bỏ công sức đào tạo từ đầu quan trọng là thái độ hợp tác với nhau lâu dài. Có nhiều bạn rất giỏi vào làm, nhưng không được dài lâu bởi không phù hợp văn hóa của công ty, gây tổn hại không hệ nhỏ vì mình làm product, vòng đời sản phẩm rất lâu cần có người đi lâu dài với nó, hiểu nó để làm sản phẩm tốt lên. Nên khi tuyển người, bọn mình không đề cao kinh nghiệm mà tinh thần, trách nhiệm tốt mớilàtiêuchíđể có thể tạo thành một tập thể vững mạnh. Đặc biệt đối với công ty startup, khác với công ty outsource một khi xong sản phẩm sẽ không quan tâm nữa, nhưng với công ty Product phải sửa chữavànângcấp sản phẩm nên áp lực cao, vì vậy nếu tinh thần team không mạnh, không đoàn kết thì sẽ chán nản và sớm từ bỏ. Do đó văn hóa của VIHAT là “Làm hết sức chơi hết mình”.
5-Vừa rồi Google có tuyên bố Kotlin là ngôn ngữ mới nhất cho Android, không biết Anh đánh giá như thế nào và có chuẩn bị gì cho sự thay đổi này không?
Ở Vihat, bọn mình tập trung rất nhiều vào công nghệ và cập nhật thường xuyên các công nghệ mới. Khi xây dựng TeraApp thì bản thân cũng đã lường trước về vấn đề này nên team luôn update những công nghệ mới nhanh nhất có thể đem lại trải nghiệm tốt nhất cho khách hàng.
6-Trong quá trình phát triển TeraApp, những khó khăn nào mà anh muốn chia sẻ với các bạn đang có dự định khởi nghiệp?
Kỹ thuật và kinh doanh là 2 vấn đề mà bản thân muốn chia sẻ với các bạn đang có dự định khởi nghiệp.
Về kỹ thuật:
ở Teraapp do nó được build từ chính ý tưởng của bọn mình nên nó rất khác biệt. Bởi việc tạo 1 ứng dụng đi động hoàn toàn tự động để phục vụ hàng ngàn khách hàng tạo ứng dụng một lúc. Đó là bài toán khó mà Teraapp phải bỏ ra 1.5 năm trời để giải quyết. Nhìn chung ra, các đối thủ khác đều không có hệ thống tự động như TeraApp.TeraApp build ramột ứng dụng thật để cho khách hàng sửdụng như một ứng dụng độc lập hoàn toàn (như một bản Demo App).
Hiện tại, ở Việt Nam cũng có vài đối thủ cạnh tranh nhưng hiện tại mình chưa thấy họ phát triển nữa, bởi với sản phẩm như Teraapp ngoài đòi hỏi vừa có đam mê thì cần phải có nguồn lực để đầu tư và phát triển thì mới có thể trụ lại trong lĩnh vực này. Về kỹ thuật mình có lời khuyên các bạn, công nghệ là con dao 2 lưỡi nó có thể giúp bạn đi nhanh cũng có thể quay lại kiềm bước chân của bạn, cần phải chọn lựa kỹ càng trước khi bắt đầu, liên tục cập nhập những kiến thức mới để cải tiến sản phẩm của bạn.
Về kinh doanh:
Sản phẩm có hay nhưng chưa chắc thành công chưa chắc đã được thị trường tiếp nhận. Đôi khi sản phẩm có người dùng lại vẫn thất bại vì họ không tìm được định hướng kinh doanh đúng đắn. Thời gian đầu kinh doanh Teraapp cũng gặp phải vấn đề này, sản phẩm có nhưng bán hoài mà không hiệu quả. Mình đã tốn rất nhiều công sức để nghiên cứu tìm tòi, tìm kiếm các anh chị đi trước để tư vấn nhằm định hướng cho sản phẩm. Hiện bên mình khá tự tin vì đã tìm được đường đi đúng để cân bằng vừa mang lại nhiều giá trị cho khách hàng vừa tạo nguồn thu để nuôi sống công ty, giúp công ty ngày càng lớn mạnh.
Sang 2018, thì bọn mình sẽ target ra nước ngoài, hiện tại thì đã có 10 đại lý ở Việt Nam 3 đại lý bên US. Lời khuyên của mình là các bạn Startup ngoài sản phẩm các bạn phải có định hướng tốt về kinh doanh để phát triển sản phẩm để làm được điều đó trong team của bạn phải có người có nền tảng là kinh doanh, ngoài ra có thể tìm kiếm các sự hỗ trợ từ những người đi trước, thông qua các tổ chức hỗ trợ như SVF, BSSC…
7-Anh có lời khuyên gì cho các bạn lập trình viên để thành công khi xin việc?
Trong quá trình tuyển dụng, các bạn sinh viên trẻ có mức độ đòi hỏi hơi cao so với khả năng của bản thân. Thay vì tìm một môi trường làm việc để phát triển, có level tốt thì lại chỉ nhắm tới lương cao. Như vậy rất khó cho các Startup như VIHAT để tuyển dụng và tiếp cận nguồn lực và vô hình chung làm mất cơ hội cho các bạn ấy để được tham gia vào các startup.
Các công ty outsource sẽ là nơi chi trả mức lương rất cao trong khi Startup lại là một nơi tuyệt vời để tăng kinh nghiệm/ kỹ năng để sau này có thể tự mình tạo một san phẩm vì các bạn sẽ được tham gia vào tất cả các khâu từ ý tưởng đến triển khai sản phẩm, các bạn sẽ có nhiều khó khăn, thử thách phải vượt qua, nhưng bù lại sẽ có nhiều kinh nghiệm trong quá trình xử lý tình huống. Nhưng khi mình nói ra thì nhiều bạn lại cho là lừa các bạn để vào team. Đó là vấn đề rất đáng lo, bởi thị trường lương IT hiện tại khá lý tưởng làm cho nhiều bạn sinh viên mới ra trường kì vọng quá cao.
Với developer, mình nghỉ các bạn cần 2 thứ thôi là khả năng xử lý vấn đề tốt việc này đòi hỏi bạn phải trải nghiệm càng nhiều càng tốt ở các project lớn và khả năng học hỏi, vì chúng ta làm trong môi trường công nghệ mà công nghệ thì thay đổi liên tục, bản thân phải liên tục học hỏi tiếp thu cập nhập thì mới có cái nhìn tổng quan để xây dựng một sản phẩm tốt.
Là một Developer, bạn sẽ phải dùng tới nhiều công nghệ khác nhau. Chưa kể dù mới hay lạ, hễ nghe tin chúng xuất hiện thì đã phải lật đật down về dùng thử. Sau một thời gian học hỏi thì tôi nhận ra rằng dù có thay đổi kiểu gì vẫn sẽ có một số technology là bạn luôn cần phải có trong túi đồ nghề của mình.
Trước tiên, tôi viết bài này với mindset của một fullstack developer. Và tôi cũng tin rằng một developer nên có khả năng linh hoạt làm được mọi task. Không có ý ám chỉ rằng việc bạn giỏi chỉ một lĩnh vực là điều tiêu cực nhưng tôi cho rằng developer tài năng khi họ có thể học hỏi và mở rộng kĩ năng trên mọi lĩnh vực. Nhưng vậy trước tiên chúng ta cần một gốc rễ cơ bản, một túi đồ nghề chứa đựng những tool cần thiết.
Một Web Framework
Có thể là Ruby trên Rails, hay Node.js,PHP,Phoenix, hoặcPerfect, et. Ý tưởng ở đây là bạn có học cho bản thân mình về một web framework – nó có thể tạo, đọc, update và xóa (CRUD) data từ một database sau khi nhận được một request từ HTTP. Ngoài ra nó còn có thể làm những background task hoặc thêm data và một queue/stream để xử lí sau.
Một Task Runner/Scheduler
Task runner dành cho việc lên lịch để chạy các task. Nó có thể là Cron,sidekiq,Verk, hay thậm chí là cả windows task scheduler. Bạn cần học được là có một số tasks phải diễn ra trong thời gian thực hoặc theo một request, nhưng có thể để sau. Ví dụ như khi bạn đang processing một file upload, khi đó hiển thị là ‘we got your file, thanks!’ nhưng background task lại liên quan tới quá trình xử lí nó hoặc việc gửi email sau khi quá trình trên hoàn thành.
Queue Software
RabbitMQ hoặcAmazon SQS hayAzure Queue Storage/Message Bus đều là những lựa chọn tuyệt vời. Bạn cần biết về những software thuộc backend với tên gọi “producers” và chúng có chức năng gắn data lên queue cho các “consumer” sử dụng. Queue software cho phép bạn bắt đầu, thêm hoặc ngừng số consumer tùy thuộc vào server của bạn.
Stream Software
Tương tự như queuing, khi item được đưa vào queue sẽ bị lấy ra bởi consumers; streaming software cho phép lượng data flow chảy qua như một dòng sông và các consumers thoải mái tương tác với những data đó. Những phần mềm đáng nhắc tới bao gồm Kafka, Amazon Kinesis etc.
Một Frontend Framework
Lựa chọn khá đa dạng bao gồm EmberJS,Angular,React+Redux,Vue.js, thậm chí là cả jQuery! Bạn sẽ cần phải học một front end framework để hiểu được những điều vô cùng thú vị như browser quirks, trans/compilation của các ngôn ngữ, web debugging/inspecting, responsive design, de/serialization của data và cả UI/automated testing.
Một Mobile App Framework
Đối với một số bạn thì có lẽ nó không cần thiết nhưng theo tôi ít nhất bạn cũng nên học một mobile platform như iOS hoặc Android (có thể là Cordova,React Native, hoặc là cả Unity). Lập trình mobile thật sự sẽ dạy cho bạn rất nhiều điều hữu ích liên quan tới user experience cũng như vấn đề về hình ảnh, vị trí cũng như cả thời lượng Pin.
Một ngôn ngữ về Scripting
AppleScript, Bash, Powershell, Python hoặc Ruby đều là lựa chọn tốt để bạn có thể chạy một task tự động. Một developer giỏi là khi biết được lúc nào cần bỏ công sức và lúc nào thì cần dùng “hack” để giải quyết những vấn đề không đáng quan tâm.
Relational Database
MySQL,PostgreSQL,MS SQL Server hoặc là database tương tự vậy. Việc bạn cần biết là cách thức mà relational databases hoạt động như nào cũng như cách mà record được lưu trự và truy xuất. Đây là một dịp tốt để bạn học và hiểu được lợi thế giữa stored procedures so với code procedure cũng như dạng tối ưu hóa nào có thể làm ngay trong thời điểm lưu trữ cũng như xuất dữ liệu.
Và một Non-relational database
Ngày càng có nhiều những database như thế này nhằm phục vụ cho từng task khác nhau, ví dụ như ElasticSearch dành cho tìm kiếm hoặcDruid đối với data thuộc based time. MongoDB hoặcDynamoDB cũng là 2 lựa chọn nổi bật nếu bạn muốn NoSQL databases dành cho các task chung chung tí.
Với tất cả những tool trên, bạn sẽ có khả năng tạo ra bất cứ phần mềm và ứng dụng trên bất kì một platform nào miễn là bạn có hứng thú. Tất nhiên không thể học hết chúng chỉ trong vài tuần nhưng với định hướng cho vài năm thì lại là một chuyện hoàn toàn có thể. Bạn cũng không cần phải lo lắng về việc phải học hết, cứ tập trung vào cái nào bạn thích trước và làm cho giỏi đã bởi đó sự nghiệp của bạn mà.
Dù bạn giỏi đến đâu, nếu không biết cách trình bày thông tin theo một kết cấu khoa học nào đó, người nghe sẽ gặp khó khăn khi theo dõi. Nghiên cứu khoa học cho thấy người nghe sẽ nhớ chính xác 40% thông tin nếu bài trình bày có kết cấu. Vì vậy, hôm nay sẽ chia sẻ với các bạn cách sắp xếp thông tin giúp bạn dễ nhớ hơn khi trình bày và giúp cho người nghe dễ theo dõi và tập trung.
Cách 1 – Kết cấu 3 I’s:
Issue – vấn đề: nêu vấn đề một cách đơn giản và dễ hiểu
Illustration – minh hoạ: não người rất thích nghe kể chuyện và nghe ví dụ minh hoạ. Khi người trình bày sử dụng ví dụ minh hoạ hay kể chuyện hài hước, chuyện truyền cảm hứng, vv, người nghe nhớ lâu hơn.
Invite – mời tham gia: đặt câu hỏi khiến người nghe phải tham gia trả lời. Đơn giản như hỏi “Các bạn nghĩ sao về vấn đề này?”
Kết cấu 3 I’s nên sử dụng cho những buổi thảo luận, đối thoại, tư vấn, cần người khác tham gia đóng góp quan điểm của mình.
Cách 2 – Kết cấu 3-Ws
Đây là kết cấu trình bày do trường đại học Stanford sử dụng.
What – Vấn đề gì?: định nghĩa chính xác ý tưởng chính hay vấn đề chính mà bạn muốn trình bày. Tốt nhất là đơn giản hoá đến mức 1 hay 2 câu.
So what: – Rồi sao nữa? câu hỏi này bắt buộc bạn phải nói rõ tại sao đề tài này lại quan trọng đối với khán giả của mình. Giải thích chuyện gì sẽ xảy ra nếu người nghe không phản ứng với vấn đề nêu ra. Sử dụng các dữ liệu nghiên cứu và bằng chứng để minh hoạ.
Now what? – Rồi giờ giải quyết sao? Đây là lúc người trình bày cung cấp cho người nghe giải pháp. Giải pháp được trình bày theo thứ tự lớp lang và có chỉ dẫn rõ ràng.
Kết cấu 3-Ws nên sử dụng khi đứng lớp huấn luyện, trong môi trường hướng dẫn, giảng dạy, khi cần trình bày một cách thuyết phục.
Cách 3 – PSB
Đây là cách trình bày tập trung vào việc đưa ra giải pháp cho một vấn đề.
Problem – Vấn đề: bắt đầu bằng việc trình bày một vấn đề
Solution – Giải pháp: sau đó đưa ra giải pháp cụ thể và hệ thống cho vấn đề vừa nêu ra.
Benefit – Lợi ích: nhắc đến lợi ích một cách nhẹ nhàng, khiến khán giả tự rút ra được từ giải pháp bạn vừa cung cấp.
Kết cấu PSB tốt nhất là sử dụng khi trình bày trong môi trường trang trọng, khi trình bày cơ hội, họp hành, và trong môi trường học thuật.
Bài toán truyền thông trong IoT chủ yếu liên quan tới những vấn đề phát sinh trong việc truyền thông giữa 3 nhóm: thiết bị, gateways và Cloud. Cụ thể hơn thì quá trình truyền thông đó chủ yếu liên quan tới trao đổi message(thông điệp). Việc trao đổi message thường tuân theo một mô hình truyền thông nhất định. Và với mỗi mô hình truyền thông thì cách trao đổi message lại khác nhau đôi chút. Để lựa chọn được giải pháp truyền thông phù hợp cho sản phẩm IoT, chúng ta nên xem xét đầy đủ các mô hình truyền thông IoT.
Dựa vào cách thức trao đổi message, ta có thể chia các mô hình truyền thông IoT thành 4 nhóm như sau:
Telemetry: dữ liệu (message) di chuyển 1 chiều từ thiết bị đến hệ thống. Mục đích là gửi trạng thái của thiết bị lên phía hệ thống.
Inquiry: gửi các request của device lên hệ thống, các request này liên quan tới việc thu thập các thông tin mà thiết bị hiện tại không thu thập được. Các thông tin đó được dùng để kích hoạt một sự kiện nào đó được mô tả từ trước.
Command: gửi mệnh lệnh từ hệ thống tới thiết bị hoặc 1 nhóm thiết bị để bắt các thiết bị đó thực thi một công việc cụ thể, đồng thời yêu cầu trả về trạng thái thực thi công việc
Notification: gần giống với Telemetry, ở mô hình này, thông tin cũng di chuyển 1 chiều, nhưng là từ hệ thống tới các thiết bị (chiều ngược lại so với Telemetry),
Ta có thể hình dung một cách trực quan về 4 mô hình này như sau:
Mỗi mô hình trên có thể cần đến việc lưu trữ dữ liệu. Khi đó, các cơ chế store & forward (lưu trữ và chuyên tiếp) sẽ được tận dụng (ví dụ: hàng đợi, topic/subscription trong các broker). Nếu bên gửi và bên nhận cùng online, ta có thể dùng các giải pháp direct message.
Cơ chế store & forward thường được áp dụng trong mô hình Command. Bởi vì khi gửi lệnh cho một device thì device đó có thể không online… Tình huống này lại phát sinh ra một giải pháp khác, đó là sử dụng thuộc tính TTL cho message (Time To Live). Khi device trở lại trạng thái online, TTL giúp device tránh được việc thực thi các lệnh quá cũ. Direct message thì lại được áp dụng cho mô hình Telemetry (mặc dù đôi khi lưu trữ các dữ liệu gửi bằng mô hình Telemetry vẫn có ích).
#1 Mô hình Telemetry
Giao thức HTTP có thể implement mô hình này theo 2 cách: hoạt động như một client, gửi PUT/POST request chứa các thông tin trạng thái cần cập nhật sang một hệ thống khác hoặc hoạt động như một server, nhận GET requests từ các hệ thống khác để thu thập dữ liệu. Trong bất kì trường hợp nào, việc implement này xoay quanh 2 hành động chính là request / reply.
Có 2 hạn chế đáng chú ý ở đây
HTTP là giao thức text-based, dài dòng và không hỗ trợ QoS – Quality of Service.
Khi hoạt động với vai trò là server, HTTP gặp vấn đề về kết nối với thiết bị trong mạng nếu có NAT hoặc roaming(mạng điện thoại di động)
Giao thức triển khai mô hình Telemetry phổ biến nhất chính là MQTT. MQTT implement luôn cả mô hình publish/subscribe. Với MQTT, các device được xem như publisher – người xuất bản. Nội dung xuất bản là các dữ liệu mà device đó thu thập hoặc xử lý được. Đích đến của các dữ liệu đó là các broker. Để gom nhóm các dữ liệu thành 1 “kênh”, MQTT sử dụng khái niệm topic. Các hệ thống/thiết bị khác muốn lấy thông tin thì sẽ hoạt động như subscriber – người theo dõi. Hành động theo dõi này và các message tương ứng được giới hạn theo từng topic.
MQTT hỗ trợ đầy đủ các QoS level.
Nói về nhược điểm, MQTT không hỗ trợ xử lý logic. Vì không hỗ trợ xử lý logic nên một broker có thể bị quá tải (flooded) bởi các message mà không làm cách nào để dừng nhận các message này.
Một giao thức đáng chú ý khác cũng implement mô hình này, đó là AMQP. AMQP cung cấp cả 2 phương pháp trao đổi message là request/reply và publish/subscribe.
So với MQTT, AMQP có một lợi thế lớn. Đó là khả năng thiết đặt một luồng logic điều khiển cho 2 mức khác nhau: mức byte và mức message.
#2 Inquiry
Sử dụng HTTP để implement mô hình này khá đơn giản vì bản thân giao thức HTTP đã hoạt động dưới hình thức gửi request – nhận response. Do đó, khi implement theo mô hình Inquiry, việc trao đổi thông điệp với HTTP chỉ xoay quanh các GET request từ device lên hệ thống để lấy thông tin.
Việc implement MQTT theo mô hình Inquiry khó khăn hơn vì ta sẽ phải define các ngữ nghĩa mới ở tầng ứng dụng để đảm bảo việc truyền thông giữa device và hệ thống tuân thủ đúng mô hình Inquiry.
Device cần subscribe một topic để nhận thông tin. Tuy nhiên không phải là nhận một cách thụ động! Khi nào device có nhu cầu thì device mới gửi request lên hệ thống. Và khi đó thì device lại đóng vai trò là publisher. Vì vậy, với giao thức MQTT, ta cần tạo thêm một mối tương quan trong hành động gửi request và reply tại tầng ứng dụng.
Khác với MQTT và HTTP, AMQP đáp ứng tốt yêu cầu của việc implement mô hình Inquiry.
Điều đáng chú ý là các AMQP message (message được tạo theo chuẩn của giao thức AMQP) đều chứa nhiều thông tin hữu ích (dưới dạng metadata). Đầu tiên có thể kể đến message ID và thuộc tính reply-to. Do đó, khi device gửi yêu cầu cho hệ thống, nó có thể đưa thêm thông tin về địa điểm nhận message (address). Hệ thống sẽ hồi đáp bằng một message khác kèm theo ID tương ứng (có thể sử dụng message ID của request).
Một điểm mạnh của AMQP khi implement mô hình Inquiry là tính asynchronous của giao thức này. Nhờ đặc tính asynch vốn có, các thông điệp hồi đáp từ phía hệ thống có thể đến device theo bất kỳ thứ tự nào mà không làm mất đi sự tương quan của message hồi đáp với request yêu cầu nó.
#3 Mô hình Command
Mô hình này hơi ngược so với Inquiry, bên bắt đầu quá trình truyền thông lại là hệ thống chứ không phải device.
Với giao thức HTTP, mô hình này có thể implement bằng cách cho device nhận một trong 2 vai trò: client hoặc server. Nếu device hoạt động như một server, hệ thống sẽ gửi POST request và chờ đợi response tương ứng (synchronous) từ phía device để biết quá trình thực thi mệnh lệnh có diễn ra suôn sẻ không… Nếu device hoạt dộng như client, device sẽ gửi GET request lên hệ thống để hỏi xem có mệnh lệnh nào cần thực thi không. Nếu không có lệnh nào, client sẽ phải đợi (synchronous). Sau khi nhận và thực thi lệnh, device sẽ gửi POST request lên hệ thống để thông báo kết quả thực thi mệnh lệnh.
Với giao thức MQTT, nếu muốn implement theo mô hình Command, ta cũng phải đưa ra một số ngữ nghĩa mới ở tầng ứng dụng.
Bản thân MQTT không hỗ trợ kiểu truyền thông request/reply nên ta cần đưa ra một số ngữ nghĩa mới như: thiết bị subscribe một topic để nhận command, hệ thông sẽ gửi command vào topic đó. Phần payload của command (từ phía hệ thống) sẽ phải chứa request ID. Sau khi thực thi mệnh lệnh, device publish kết quả kèm theo request ID tương ứng.
Nếu device offline, ta có thể dùng “retain” flag, nhờ đó, mệnh lệnh cuối cùng từ phía hệ thống sẽ được chuyển đến khi device online trở lại.
Một lần nữa, AMQP lại tỏ ra vượt trội hơn khi implement mô hình Command.
Hệ thống có thể gửi message chứa mệnh lệnh, kèm theo message ID và thuộc tính reply-to. Sau khi thực thi mệnh lệnh, device gửi kết quả trong một message khác, kèm theo ID tương ứng với message ID của mệnh lệnh từ phía hệ thống. Message từ phía device sẽ được gửi đúng về địa chỉ mà hệ thống mong muốn nhờ thuộc tính reply-to. Việc truyền thông này cũng diễn ra không đồng bộ (asynchronous), do đó hệ thống có thể gửi hàng loạt mệnh lệnh mà vẫn nhận được response tương ứng của từng mệnh lệnh đã gửi.
Nếu device offline và ta chỉ muốn nó thực thi mệnh lệnh mới nhất từ phía hệ thống? Để giải quyết tình huống này, hãy sử dụng thuộc tính TTL (Time To Live) cho các mệnh lệnh gửi đi từ hệ thống.
#4 Mô hình Notification
Mô hình này ngược với Telemetry, luồng lưu thông message thì lại gần giống với mô hình Command, tuy nhiên việc trao đổi message theo mô hình Notification không cần reply cho mỗi message nhận được.
Với giao thức HTTP, device nhận notification từ hệ thống. Trong quá trình truyền thông với device, hệ thống hoạt động như một server (hệ thống sẽ gửi POST request) hoặc client (hệ thống sẽ gửi GET request). Nếu hệ thống hoạt động như một client, nó chỉ có thể reply khi notification từ phía thiết bị đã sẵn sàng (long polling) hoặc reply ngay lập tức. (device has to poll the server aditional times). Tất nhiên, khi sử dụng HTTP, các vấn đề liên quan tới NAT và roaming đưa ra ở đầu bài viết là không thể tránh khỏi.
Với giao thức MQTT, device sẽ subscribe một topic. Server publish notification vào topic đó. Mọi thứ diễn ra suôn sẻ vì mô hình Notification này rất gần với cơ chế publish/subscribe của MQTT. Tuy nhiên, nếu ta không define thêm phần logic xử lý ở tầng ứng dụng, device có thể bị quá tải do liên tục nhận các notification từ topic đang subscribe.
Cuối cùng, với AMQP, device vừa có thể nhận notificaiton vừa có thêm phần logic xử lý giúp device ngừng nhận notification khi không đủ khả năng xử lý.
Tên xuất hiện ở khắp nơi trong phần mềm. Chúng ta đặt tên cho biến, hàm, danh sách tham số, lớp, gói. Sau đó chúng ta đặt tên tệp và tên thư mục chứa chúng. Rồi chúng ta đặt tên tệp jar và tệp war, tệp ear. Chúng ta đặt tên, đặt tên và đặt tên. Vì chúng ta phải làm điều đó rất nhiền, nên chúng ta cần phải làm tốt. Sau đây là một số quy tắc đơn giản để tạo ra một cái tên tốt.
Sử dụng những tên gợi tả mục đích
Thật đơn giản để nói về những cái tên được gợi tả. Điều mà chúng tôi muốn bạn ghi nhớ đó là chúng ta cần nghiêm túc về vấn đề này. Việc lựa chọn tên tốt mất nhiều thời gian nhưng lại tiết kiệm được rất nhiều khi dùng. Vì vậy cần chú ý tới những cái tên bạn đặt và thay đổi chúng khi bạn tìm thấy tên tốt hơn. Khi bạn làm điều được đó, tất cả những ai khi đọc đoạn mã của bạn (bao gồm cả bạn) sẽ thấy dễ hiểu hơn.
Tên của biến, hàm, lớp nên giải đáp cho tất cả những câu hỏi lớn. Nó sẽ cho bạn biết lý do tại sao nó tồn tại, những gì nó làm, và cách nó được sử dụng. Nếu một cái tên cần được yêu cầu giải thích, thì tên này không có ý nghĩa gợi tả.
int d; // thời gian trôi qua trong ngày
Tên biến d cho thấy không có nghĩa gì. Nó không diễn tả cảm giác thời gian trôi qua, cũng không phải nói về ngày. Chúng ta nên chọn một tên mô tả được điều đang diễn ra như:
int elapsedTimeInDays;
int daysSinceCreation;
int daysSinceModification;
int fileAgeInDays;
Sự chọn lựa những tên gợi tả làm cho ta dễ dàng hiểu và thay đổi khi lập trình hơn. Mục đích của đoạn mã này là gì?
public List<int[]> getThem() {
List<int[]> list1 = new ArrayList<>();
for (int[] x : theList) {
if (x[0] == 4) {
list1.add(x);
}
}
return list1;
}
Tại sao lại khó có thể giải thích đoạn mã này đang làm gì? Không có biểu thức phức tạp, khoảng cách và thụt đầu dòng hoàn toàn hợp lý. Chỉ có ba biến và hai hằng được đề cập đến. Không hề có bất kỳ lớp hoặc phương thức đa hình, dường như chỉ là một danh sách mảng.
Vấn đề không phải là sự đơn giản của đoạn mã, nhưng có tính “không tường minh” của đoạn mã (để đồng xu cụm từ): mức độ mà bối cảnh là không rõ ràng trong các mã chính nó. Mã ngầm đòi hỏi chúng ta biết câu trả lời cho những câu hỏi như:
1. theList thuộc loại nào?
2. Nghĩa của chỉ số bắt đầu từ không của một phần tử trong theList là gì?
3. Số 4 có nghĩa gì?
4. Tôi sử dụng danh sách trả về như thế nào?
Câu trả lời cho những câu hỏi không thấy trong đoạn mã trên, nhưng chúng có thể đã có. Hãy hiểu rằng chúng ta đang làm việc với trò chơi dò mìn. Chúng ta thấy bảng chứa danh sách các ô được gọi là theList. Hãy đặt lại tên thành gameBoard.
Mỗi ô trên bảng được biểu diễn bởi một mảng. Chúng ta cũng thấy rằng chỉ số thứ 0 là vị trí của một trạng thái và giá trị trang thái 4 có nghĩa là “được đánh dấu” (flagged). Bằng cách đưa ra những tên khái niệm chúng ta có thể cải tiến đáng kể đoạn mã:
public List<int[]> getFlaggedCells() {
List<int[]> flaggedCells = new ArrayList<int[]>();
for (int[] cell : gameBoard) {
if (cell[STATUS_VALUE] == FLAGGED) {
flaggedCells.add(cell);
}
}
return flaggedCells;
}
Chú ý rằng tính đơn giản của đoạn mã trên là không thay đổi. Đoạn mã vẫn có chính xác các hằng và toán tử cùng mức lồng nhàu. Nhưng đoạn mã trên đã trên nên từng minh hơn.
Chúng ta có thể phát triển thêm, thay vì sử dụng mảng số nguyên, ta tạo ra một lớp đơn giản cho các ô. Lớp này chứa một hàm gợi tả (gọi là isFlagged) để ẩn đi các con số ma thuật. Đây là phiên bản mới của hàm:
public List getFlaggedCells() {
List flaggedCells = new ArrayList();
for (Cell cell : gameBoard) {
if (cell.isFlagged()) {
flaggedCells.add(cell);
}
}
return flaggedCells;
}
Với những thay đổi tên đơi giản, thật không khó khăn để có thể hiểu điều gì đang diễn ra. Đây chính là điểm mạnh của việc chọn được những cái tên tốt.
Tránh sai lạc
Lập trình viên phải tránh để lại manh mối sai mà che khuất nghĩa đoạn mã lệnh. Chúng ta nên tránh những từ có nghĩa khác với ý định thực của mình. Ví dụ, hp, aix, sco là những tên biến kém bởi chúng là những cái tên mô tả trong hệ điều hành Unix hay các phiên bản của nó. Thậm chí nếu bạn đang lập trình về hypotenuse và hp nhìn giống như từ viết tắt, đây không phải là thông tin tốt.
Không nên gọi một nhóm các tài khoản (account) là accountList trừ khi nó lưu trữ danh sách (list) thật sự. Từ danh sách (list) có nghĩa là một cái gì đó cụ thể cho các lập trình viên. Nếu các tài khoản này không được lưu trữ ở dạng danh sách, thì có thể danh đến những kết luận sai lệch. Vì vậy cái tên accoutGroup hoặc bunchOfAccounts chỉ ra danh sách chủ tài khoản vẫn tốt hơn.
Hãy cẩn trọng khi sử dụng những tên không khác nhau nhiều. Bao lâu để phát hiện sự khác biệt giữa XYZControllerForEfficientHandlingOfStrings trong một module và XYZControllerForEfficientStorageOfStrings ở một nơi khác không xa lắm. Chúng có hình dạng giống nhau kinh khủng.
Các biến có cách viết tương tự nhau cũng có vấn đề như khi tương tự nhau về thông tin. Sử dụng cách viết không nhất quán cũng dẫn đến việc hiểu sai lạc. Với môi trường lập trình Java hiện đại (IDE), chúng ta có sử dụng tính năng tự động hoàn hành mã. Chúng ta viết một vài ký tự của tên và nhấn phím tắt (nếu có) và IDE cho bạn một danh sách các tên để hoàn tất cho việc đặt tên. Điều này thật hữu ích nếu những cái tên có nghĩa tương tự nhau, được sắp xếp theo thứ tự bảng chữ cái, bởi vì các nhà phát triển đôi khi muốn chọn một cái tên mà không xem ý kiến của ai thậm chí các phương thức của lớp đó.
Một ví dụ thực sự khủng khiếp của tên gây hiểu sai khi sử dụng ký tự thường của L hoặc ký tự hoa của o làm tên biến. Tất nhiên vấn đề ở chỗ là chúng ta nhìn thấy các biến này gần giống con số 1 hoặc 0.
int a = l;
if (O == l) {
a = O1;
} else {
l = 01;
}
Người đọc có thể nghĩ đây là một cái bẫy, và chúng ta phải kiểm tra những đoạn mã như vậy. Trong trường hợp tác giả của đoạn mã đề nghị sử dụng một phông chứ khác để phân biệt sự khác nhau, một giải pháp sẽ khuyên họ cần viết tài liệu rõ ràng hoặc trao đổi để hiểu vấn đề rõ ràng hơn. Nhưng vấn đề ở chỗ nên dứt khoát khuyên họ sửa lại thành tên rõ ràng hơn.
Tạo nên sự khác biệt rõ ràng
Lập trình viên sẽ tự tạo ra vấn đề khi họ viết mã chỉ để thỏa mãn trình biên dịch hoặc trình thông dịch. Ví dụ, bởi vì bạn không thể sử dụng cùng một tên để chỉ hai việc khác nhau trong cùng một phạm vi, bạn có thể bị cám dỗ để thay đổi tên một tên theo cách ngẫu nhiên. Đôi khi, điều này được thực hiện do lỗi chính tả, dẫn đến tình huống ngạc nhiên sửa lỗi chính tả dẫn đến đoạn mã không có khả năng biên dịch được (Ví dụ khi đặt tên lớp là kclass bởi tên class đã được sử dụng cho việc khác).
Là không đủ khi thêm một dãy số hay từ nóng, thậm chí trình biên dịch vẫn thỏa mãn. Nếu có ý nghĩa khác nhau, thì chúng phải có tên khác nhau.
Đặt tên cho một dãy số là (a1, a2, …, aN) là ngược lại với việc đặt tên có chủ đích. Những tên này không làm hiểu sai, nhưng chúng cũng không có thông tin. Chúng không cung cấp manh mối về ý tưởng của tác giả. Hãy xem xét:
public static void copyChars(char a1[], char a2[]) {
for (int i = 0; i < a1.length; i++) {
a2[i] = a1[i];
}
}
Hàm này sẽ dễ hiểu hơn khi biến source và destination được sử dụng như tên tham số truyền vào.
Những từ nhiễu là một trường hợp khác của tên mà không có sự khác biệt đáng kể. Hãy tưởng tượng rằng bạn có lớp Product. Nếu bạn có một lớp khác được gọi ProductInfo hay ProductData. Bạn đặt những tên khác nhau mà không tạo ra bất kỳ sự khác biệt nào. Info và Data là hai từ nhiễu.
Lưu ý rằng quy ước sử dụng tiền tố (như a, the) không có vấn đề gì sai bởi chúng tạo nghĩa khác biệt. Ví dụ bạn phải sử dụng a cho tất biến cục bộ và the cho tất cả các tham số của hàm. Những sẽ là vấn đề khi bạn quyết định gọi tên biến theZork bởi vì bạn đã có một tên biến khác được đặt là zork.
Các từ nhiễu là thừa. Một biến không bao giờ nên có tên variable. Từ table không nên xuất hiện trong tên bảng. Tên NameString tốt hơn Name ở chỗ nào? Name đã bao giờ là số thực chưa? Nếu như vậy nó phát vỡ quy tắc trước về sự sai lệnh thông tin. Hãy tưởng tượng việc tìm ra tên lớp là Customer và một cái tên khác đặt là CustomerObject. Bạn thấy sự khác biệt giữa hai cái tên này là gì? Tên nào sẽ mô tả tốt nhất cho lịch sử thanh toán của một khách hàng?
Có một ứng dụng mà chúng ta biết để minh họa điều này. Chúng tôi đã đổi tên để bảo vệ lỗi, nhưng đây là sự chính xác của lỗi:
Làm thế nào để lập trình viên trong dự án biết các hàm được gọi?
Trong trường hợp không có quy ước cụ thể, biến moneyAmount là không có sự khác biệt với tiền, customerInfo không có sự khác biệt với customer, accountData không có sự khác biệt với account, và theMessage không có sự khác biệt với message. Các tên khác biệt trong trường hợp này giúp người được biết sự khác biệt được đưa ra.
Sử dụng tên đọc được được
Hummans là từ có nghĩa tốt. Một phần quan trọng của bộ não chúng ta là dành riêng các các khái niệm về từ. Những từ này được định nghĩa hay phát âm. Nó sẽ là một sự sai lầm khi không thể tận dụng những ưu điểm lớn này của bộ não chúng ta để đối phó với ngôn ngữ nói. Vì vậy tên của bạn được phát âm.
Nếu bạn không thể phát âm những cái tên, bạn không thể thảo luận về nó mà không suy nghĩ gì không khác nào một tên ngốc.
Một công ty mà tôi biết là genymdhms (ngày thành lập, tháng, năm, giờ, phút, giây) họ đi xung quanh và nói “gen why emm dee aich emm es”. Tôi có thói quen không tốt khi phát âm các vấn đề như văn bản, do vậy tôi bắt đầu nói “gen-yah-mudda-hims”.
Nó sau đó đã được gọi này bởi một loạt các nhà thiết kế và các nhà phân tích, và chúng tôi vẫn có vẻ ngớ ngẩn. Nhưng chúng tôi đã ở trên các trò đùa, vì vậy nó rất thú vị. Vui vẻ hay không, chúng tôi đã dung túng đặt tên nghèo. Phát triển mới phải có các biến giải thích cho họ, và sau đó họ nói về nó trong ngớ ngẩn từ hư cấu thay vì sử dụng thuật ngữ tiếng Anh phù hợp. so sánh
class DtaRcrd102 {
private Date genymdhms;
private Date modymdhms;
private final String pszqint = "102";
/* ... */
};
to
class Customer {
private Date generationTimestamp;
private Date modificationTimestamp;
private final String recordId = "102";
/* ... */
};
Cuộc trò chuyện hay hơn bây giờ có thể: “Này, Mikey, hãy xem hồ sơ này! Dấu thời gian thế hệ được thiết lập để ngày ngày mai! Làm thế nào mà có thể được? ”
Sử dụng tên tìm kiếm được
Tên đơn thư và hằng số có một vấn đề đặc biệt ở chỗ chúng không dễ dàng để xác định vị trí trên một cơ thể của văn bản.
Nếu biến và hằng được sử dụng nhiều nới trong đoạn mã. Cần tạo ra tên tìm kiếm thân thiện.
So sánh:
for (int j = 0; j < 34; j++) {
s += (t[j] * 4) / 5;
}
Với
int realDaysPerIdealDay = 4;
const int WORK_DAYS_PER_WEEK = 5;
int sum = 0;
for (int j = 0; j < NUMBER_OF_TASKS; j++) {
int realTaskDays = taskEstimate[j] * realDaysPerIdealDay;
int realTaskWeeks = (realdays / WORK_DAYS_PER_WEEK);
sum += realTaskWeeks;
}
Chú ý biến sum, không phải là một cái tên đầy đủ hữu ích vì ít nhất cũng có thể tìm được. Sự cố ý đặt đoạn mã nhưng lại dễ dàng tìm WORK_DAYS_PER_WEEK hơn là đặt với con số 5 và đọc tiếp xuống chỉ còn các trường hợp với nghĩa như mong muốn.
Tránh trùng bảng mã
Chúng tôi có đủ mã hóa để đối phó với không bổ sung thêm vào gánh nặng của chúng tôi. mã hóa loại, phạm vi thông tin vào tên đơn giản là thêm một gánh nặng thêm giải mã. nó hầu như không có vẻ hợp lý để yêu cầu mỗi nhân viên mới để tìm hiểu thêm một mã hóa “ngôn ngữ” ngoài học tập (thường là đáng kể) cơ thể của mã mà họ sẽ làm việc vào Đây là một gánh nặng tinh thần không cần thiết khi cố gắng giải quyết một vấn đề. tên mã hóa hiếm khi phát âm được và rất dễ sai loại.
Hungarian Notation
Trước đây, khi chúng ta làm việc với ngôn ngữ name-length-challenged, chúng ta đã vi phạm nguyên tắc cần thiết và đã phải hối tiếc. Fortran buộc phải mã hóa bằng cách làm cho chữ cái đầu tiên một mã số cho các loại. Phiên bản đầu của BASIC cho phép chỉ có một ký tự với một chữ số. Hungarian Notation (HN) đã diễn này lên một tầm cao mới.
HN được coi là trở lại khá quan trọng trong Windows C API, khi tất cả mọi thứ đều xử lý với số nguyên hoặc một con trỏ kiểu long hay một con trỏ kiểu void, hoặc một vài sự thực thi của “chuỗi” (với mục đích sử dụng và các thuộc tính khác nhau). Trình biên dịch đã không kiểm tra các kiểu trong những ngày đó, vì vậy các lập trình viên cần một cái nạng (crutch) để giúp họ nhớ các loại.
Trong ngôn ngữ lập trình hiện đại, các kiểu dữ liệu phong phú hơn, các trình biên dịch nhớ và thực thi được nhiều loại hơn. Hơn nữa, có xu hướng xây dựng các lớp nhỏ hơn và các hàm ngắn gọi hơn vì vậy người ta thường thấy điểm khai báo của mỗi biến mà họ đang sử dụng.
Lập trình viên java không đến kiểu dữ liệu mã hóa. Các đối tượng là các kiểu dữ liệu mạnh và việc tạo nên môi trường tiến bộ như vậy giúp ta có thể xác định một loạt các lỗi trước khi trình biên dịch chạy. Vì vậy, hiện nay HN và các dạng thức khác nhau của các kiểu mã hóa chỉ là những trở ngại đơn giản. Chúng chỉ làm khó khăn hơn cho việc thay đổi tên hoặc kiểu dữ liệu của biến, hàm, lớp. Và cũng khó khăn cho việc đọc mã. Ngoài ra còn có thể tạo ra một hệ thống mã hóa sẽ gây hiểu lầm cho người đọc.
PhoneNumber phoneString;
// name not changed when type changed!
Thành phần tiền tố
Bạn không cần phải xác định tên với với tiền tố m_. Các lớp và hàm nên đủ nhỏ để không cần phải dùng đến các tiền tố đó. Và bạn nên sử dụng editing environment để đánh dấu hoặc bôi màu cho các lớp hay hàm để tạo nên sự khác biệt giữa chúng.
public class Part {
private String m_dsc; // The textual description
void setName(String name) {
m_dsc = name;
}
}
public class Part {
String description;
void setDescription(String description) {
this.description = description;
}
}
Bên cạnh đó, người ta thường bỏ tiền tố (hoặc hậu tố) để thấy được phần tên có ý nghĩa hơn. Chúng ta đọc đoạn mã ít tiền tố hơn là phải thấy các đoạn mã nhiều tiền tố. Điều cuối cùng là tiền tố trở nên lộn xộn đó là dấu hiệu của đoạn mã chưa có sự cải tiến.
Giao diện và cài đặt
Thỉnh thoảng có một vài trường hợp đặc biệt khi mã hóa. Ví dụ, nếu bạn đang xây dựng một Abstract Factory để tạo ra đối tượng Shapes (hình). Factory này sẽ được tạo dưới dạng là interface và sẽ được thực thi bởi một lớp cụ thể. Vậy bạn nên đặt tên thế nào cho Factory đó? IShapeFactory hay ShapeFactory? Tôi thích interface ShapeFactory hơn. Khi xác định I phía trước interface, có nhiều phân tán và thông tin không tốt. Vì tôi không muốn khách hàng của tôi biết rằng tôi đang bàn giao cho họ một interface. Tôi chỉ muốn họ biết rằng đó là một ShapeFactory. Do vậy để mã hóa hay thực thi interface tôi chọn sự thực thi (implementation). Gọi đó là ShapeFactoryImp, hoặc thậm chí CShapeFactory hơn là mã hóa interface.
Tên lớp
Lớp và đối tượng nên có danh từ hoặc cụm danh từ như Customer, WikiPage, Account, và AddressParser. Tránh dùng những từ như Manager, Processor, Data, Infor trong tên của một lớp. Tên một lớp không nên là một động từ
Tên phương thức
Phương thức nên có động từ hoặc cụm động từ như postPayment, deletePage, hoặc save. Các phương thức truy xuất, thay đổi nên được đặt tên cho giá trị của chúng và tiền tốt get, get và is theo chuẩn của javabean.
string name = employee.getName();
customer.setName(“mike”);
if (paycheck.isPosted())…
Khi phương thức khởi tạo được nạp chồng, dùng phương thức tính với tên mô tả đối số truyền vào. Ví dụ:
Hãy xem xét việc ép buộc dùng chúng bằng cách chuyển phương thức khởi tạo tương ứng thành private.
Không nên dùng tiếng lóng
Nếu những cái tên là quá đặc trưng, thường chúng sẽ được ghi nhớ với người chia sẻ cảm nhận vui vẻ và chỉ những người này mới nhớ những câu chuyện đó. Liệu chúng ta có biết hàm được đặt tên HolyHandGrenade hỗ trợ làm gì không? Chắc chắn hàm này là một tên đặc trưng nhưng có lẽ trong trường hợp này nên đặt tên DeleteItems có thể sẽ tốt hơn.
Sự lựa chọn tường minh vẫn hơn là các giá trị giải trí. Việc đặt tên quá đặc trưng trong đoạn mã thường xuất hiện trong các trường hợp thân mật hoặc tiếng lóng. Ví dụ, đừng sử dụng tên whack() để giải nghĩa là kill(). Không nên dùng tên địa phương khi nói chuyện như eatMyShort() để giải nghĩa abort(). Hãy nói những gì bạn thấy có nghĩa. Sự có nghĩa ở đây chính là những điều bạn nói.
Chọn Một Từ cho mỗi Khái Niệm
Hãy chọn một từ cho mỗi khái niệm trừu tượng và gắn nó vào. Ví dụ, các phương phức tương đương của các lớp khác nhau có những tên fetch, retrieve và get. Làm sao bạn có thể nhớ được tên của phương thức trong mỗi lớp? Thật buồn, bạn vẫn thường phải nhớ công ty, nhóm hoặc cá nhân nào đã viết thư viện hoặc lớp đó để biết tên nào được sử dụng, nếu không bạn phải mất thời gian đáng kể để tìm kiếm.
Những IDE hiện đại như Eclipse và IntelliJ cung cấp những gì có thể dùng được trong hoàn cảnh đó, ví dụ như danh sách phương thức có thể gọi trên một đối tượng nào đó. Nhưng chú ý rằng, danh sách này không thường xuyên cho chúng ta những chú thích mà bạn đã viết xung quanh tên phương thức, danh sách tham số. Bạn thực là may mắn nếu IDE cho bạn biết tên của của tham số của phương thực. Tên phương thức phải độc lập và thống nhất để bạn có thể chọn đúng phương thức mà không cần phải tìm kiếm gì thêm.
Tương tự, việc có controller, manager và driver trong cùng một mã nguồn sẽ gây bối rối.
Đâu là sự khác biện căn bản giữa DeviceManager và Protocol-Controller? Tại sao cả hai không mang tên controller hoặc manager? Cả hai có thực sự là Driver? Tên làm bạn nghĩ rằng đó hai đối tượng của hai loại rất khác nhau cũng như hai lớp khác nhau.
Một thuật ngữ nhất quán đem lại lợi ích rất lớn cho những ai sử dụng mã nguồn của bạn.
Không chơi chữ
Hãy tránh việc dùng một từ cho hai mục đích. Sử dụng một thuật ngữ cho hai ý tưởng khác nhau cơ bản là một trò chơi chữ.
Nếu bạn tuân thủ quy tắc “một từ một khái niệm”, thì bạn làm cho nhiều lớp có, ví dụ, một phương thức add. Không quan trọng giá trị trả về hoặc tham số đầu vào nhiều như thế nào, nhưng những phương thức add có ý nghĩa tương đương.
Tuy nhiên bạn nên cân nhắc việc dùng từ add vì lý do “nhất quán” khi bạn thực sự không thêm vào theo cùng nghĩa. Giả sử rằng chúng ta có phương thức add ở nhiều lớp, là tạo một giá trị mới bằng cách thêm vào hoặc nối hai giá trị có sắn. Bây giờ chúng ta viết một lớp mới mà có phương thức để cho một tham số vào một tập. Chúng ta có nên gọi nó là add? Có vẻ sẽ là nhất quán bởi chúng ta đã có nhiều phương thức tên là add, nhưng trong trường hợp này thì ý nghĩa là khác, bởi thế chúng ta nên dùng tên là insert hoặc append thì tốt hơn. Nếu gọi tên phương thức mới này là add thì đó là một trò chơi chữ.
Mục đích của chúng tôi, như những tác giả, là làm cho mã nguồn nguồn dễ hiểu nhất có thể. Chúng tôi muốn mã nguồn của mình có thể lướt nhanh, chứ không phải một nghiên cứ nặng nề. Chúng tôi muốn dùng mẫu bìa giấy phổ biến nơi tác giả có trách nhiệm tự làm rõ chứ không phải mẫu hàn lâm nơi công việc của trường học là đào sâu ý nghĩa.
Dùng tên của miềm giải pháp
Nên nhớ rằng những người đọc mã của bạn là lập trình viên. Nên hãy dùng những thuật ngữ của khoa học máy tính, tên trong giải thuật, tên mẫu thiết kế, tên toán học, v.v. Sẽ là không hay lắm nếu mọi tên đều là của miền nghiệp vụ bởi chúng ta không muốn những đồng nghiệp của mình phải chạy và ép hỏi khách hàng ý nghĩa của mỗi tên khi họ biết khái niệm đó bằng tên khác.
Tên accountVisitor có ý nghĩa rất rõ ràng với lập trình viên đã biết mẫu thiết kế VISITOR. Có lập trình viên nào không biết JobQueue nghĩa là gì? Có rất nhiều thứ kỹ thuật mà lập trình viên phải biết. Việc chọn những tên kỹ thuật cho những thứ này thường là hợp lý nhất.
Dùng tên miền nghiệp vụ
Khi bạn đang làm với những thứ không phải của lập trình viên (“programmer-eese”), hãy sử dụng tên nghiệp vụ. Ít nhất lập trình viên bảo trì mã của bạn có thể hỏi chuyên gia nghiệp vụ về nghĩa của nó.
Tách những khái niệm nghiệp vụ và giải pháp là một phần của việc của một lập trình viên và thiết kế tốt. Mã mà cần phải quan tâm tới những khái niệm nghiệp vụ nên mang tên của nghiệp vụ.
Thêm bối cảnh có ý nghĩa
Có rất ít tên mà tự thân có ý nghĩa, hầu hết là không. Bạn cần đặt tên vào bối cảnh, bằng việc đặt chúng vào lớp, hàm, gói có tên rõ nghĩa để giúp người đọc hiểu. Khi bạn không làm được những điều này thì có thể dùng tiền tố như giải pháp cuối cùng.
Hãy tưởng tượng bạn có các biến với tên như sau: firstName, lastName, street, houseNumber, city, state và zipcode. Đặt chúng cạnh nhau thì rất rõ là sẽ tạo thành một địa chỉ. Nhưng biến state có nghĩa gì nếu bạn thấy nó một mình trong một phương thức? Liệu bạn có hiểu ngay đó là một phần của một địa chỉ?
Bạn có thể thêm bối cảnh bằng cách sử dụng tiền tốt: addrFirstName, addrLastName, adddrState, v.v. Ít nhất người đọc sẽ hiểu rằng những biến này là phần của một cấu trúc lớn hơn. Dĩ nhiên, giải pháp tốt hơn là tạo một lớp có tên là Address. Lúc đó thì thậm chí trình biên dịch cũng biết là những biến này thuộc một câu trúc lớn hơn.
Hãy xem phương thức ở mã dẫn 2-1. Liệu những biến này cần bối cảnh có ý nghĩa hơn? Tên của phương thức chỉ cung cấp một phần của bối cảnh; thuật toán cung cấp phần còn lại. Một khi bạn đọc hết phương thức, bạn thấy ba biến number, verb và pluralModifier là phần của thông báo “guess statistics”. Thật không may là chúng ta phải phỏng đoán bối cảnh. Lần đầu khi bạn nhìn phương thức,nghĩa của những biến này là không rõ ràng.
Phương thức hơi dài và biến được dùng từ đầu tới cuối. Để chia hàm ra thành nhỏ hơn, chúng ta cần tạo lớp GuessStatisticsMessage và để ba biến này thành thuộc tính của lớp này. Điều này tạo ra một bối cảnh rõ ràng cho cả ba biến. Chúng rõ ràng là phần của GuessStatisticsMessage. Sự cải thiện về bối cảnh này cũng cho phép thuật toán rõ ràng hơn bằng cách chia nhỏ thành những hàm nhỏ hơn (Xem mã dẫn 2-2).
Trong ứng dụng tưởng tượng có tên “Gas Station Deluxe”, việc thêm tiền tố GSD vào tên các lớp là một ý tưởng tồi. Thành thật mà nói, bạn đang làm việc chống lại công cụ của chính mình. Khi bạn gõ G và nhấn phím để hoàn thành, thì bạn nhận được một danh sách rất dài các lớp trong hệ thống. Đó là việc làm khôn ngoan? Tại sao lại làm khó cho việc IDE giúp bạn?
Tương tự, khi bạn tạo lớp MailingAddress trong mô-đun kế toán (accounting) của GDS, bạn đặt tên lớp là GSDAccountAddress. Sau đó, bạn cần một địa chỉ thư cho ứng dụng danh bạ khách hàng. Bạn có sử dụng GSDAccountAddress? Liệu đó có phải là một tên đúng? Mười trong 17 ký tự là thừa và không có ý nghĩa.
Tên ngắn thường tốt hơn tên dài, nếu chúng rõ ràng. Việc không thêm bối cảnh là cần thiết.
accountAddress và customerAddress là tên tốt cho những thể hiện của lớp Address, nhưng lại là tên lớp tồi. Address là tên lớp tốt. Nếu tôi cần phân biệt giữa địa chỉ MAC, địa chỉ cổng và địa chỉ Web, thì tôi nên xem xét PostalAddress, MAC và URI. Những tên này chính xác hơn.
Lời cuối
Việc khó nhất khi đặt tên bởi nó yêu cầu kỹ năng mô tả tốt và một nền văn hóa chia sẻ. Đó là việc dạy hơn là vấn đề kỹ thuật, kinh doanh hoặc quản lý. Kết quả là, nhiều người trong lĩnh vực này không học để làm rất tốt.
Mọi người thường sợ việc đổi tên bởi họ lo lắng là một số nhà phát triển khác sẽ đánh giá. Chúng tôi không khuyến khích sự sợ hãi này và thực tế thì chúng ta được mang ơn khi đổi tên (theo hướng tốt hơn). Chúng ta sử dụng công cụ hiện đại để giải quyết những tiểu tiết để từ đó có thể tập trung vào liệu việc đoạn mã có giống như đoạn và câu không, hoặc ít nhất cũng giống như bảng và cấu trúc dữ liệu (Không phải lúc nào một câu cũng là cách tốt nhất để hiển thị dữ liệu). Có thể bạn làm ai đó ngạc nhiên khi đổi tên, giống như những cải tiến mã nguồn khác. Đừng để nó cản đường bạn.
Hãy làm theo những quy tắc này và xem liệu bạn có cải tiến được mã nguồn của mình dễ đọc hơn. Nếu bạn bảo trì mã nguồn của người khác, hãy dùng công cụ tái câu trúc để giúp giải quyết những vấn đề này. Nó sẽ trả hết vốn trong thời gian ngắn và tiếp tục cho lãi về lâu dài.