“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.
Nhắc đến dịch vụ web hosting, có rất nhiều lựa chọn tuyệt vời mà lại hoàn toàn free. Tuy vậy, có rất ít nơi cho phép bạn host full stack web app với APIs, CGI, hoặc AJAX backend queries – đặc biệt là khi bạn muốn làm gì khác hơn là chỉ PHP.
Bài viết này sẽ đơn giản là một bài hướng dẫn cặn kẽ cách bạn host scripts trên cloud server.
Khi nào thì dùng tới Cloud Application Platform
Cloud Application Platform là lựa chọn tuyệt vời khi bạn muốn viết code để chạy một server. Chúng thường cung cấp series của Linux application containers phục vụ cho việc triển khai code của bạn từ máy chủ local với một set command line keyword.
Heroku là một trong những dịch vụ hỗ trợ host code một cách dễ dàng. Với chính sách freemium model cho phép user sử dụng 500 giờ dịch vụ hoàn toàn miễn phí (Bảng giá chính thức).
Sau khi bạn đã viết xong code, bạn có thể execute commands để triển khai chúng và gửi vào một workspace của Heroku. Lúc đó, code sẽ được thi hành tùy vào trigger được đặt ra cho chúng. Trigger có thể là web page request, hoặc một quá trình xử lý thông tin nào đó.
Một điều khá hay là bạn sẽ không cần lo lắng về operating system (memory, storage, CPU, security patches) bởi chúng đều đã được quản lí giùm bạn – Tuy vậy nó đồng nghĩa với việc bạn sẽ bị giới hạn trong việc không thể chỉ định sử dụng resource một cách trực tiếp.
Sau đây là một số ví dụ điển hình về những tình huống mà Heroku trở nên vô cùng hữu ích:
Host website của chính bạn và tự viết nên web server
Thu thập dữ liệu từ một website và lưu trữ vào database để phân tích
Cung cấp một API server cho một task riêng biệt như weather data, lưu trữ Internet of Things sensor data, hoặc liên quan tới machine learning model.
Cung cấp dịch vụ database.
Cấu trúc của Heroku
Heroku cung cấp một virtual machine (VM) cho người dùng triển khai code. Tất nhiên là nếu bạn muốn dùng free thì sẽ chỉ được triển khai tới 5 application thôi (5 VM). Còn đối với ứng dụng thực của bạn, Heroku sẽ cung cấp một URL subdomain riêng. Vì thế mà project name của bạn phải không bị trùng.
Những workspace có nhiều components khác nhau như: code và resource files (không phải dynamic data files), database (Postgres), và log files.
Trên local desktop của user, Heroku sẽ dùng directory name để xác định cho project của use, đồng thời cũng là để Heroku hiểu được nội dung của chúng. Do đó bạn có thể có nhiều project khác nhau với directory riêng biệt, miễn là khi chạy Heroku commands thì nhớ để đúng folder.
Điều duy nhất bạn cần phải lưu ý đó là tất cả mọi thứ đều chạy từ memory. Không hề có bất cứ persistent storage nào. Tôi xin nhắc lại – bạn không thể lưu trữ bất cứ file nào trên file server. Cho persistence, Heroku cung cấp một postgress SQL database cho bạn lưu trữ theo ý thích.
Một ví dụ đơn giản – tạo ra tính năng phát hiện những thay đổi trên website
Nói cách khác nó sẽ y như trang www.changedetection.com; với một số component chính bạn cần phải có như:
Một database dùng để lưu trữ: (a) địa chỉ email để notify sự thay đổi trên website; (b) website để track; (c) một bản ‘copy’ của website.
Một đoạn code với tính năng kiểm tra ột website trong database của #1 (Python script)
Một job scheduler để chạy #2
Một web user interface để add/delete website để theo dõi trong database của #1
Một cơ chế gửi emails
Yêu cầu đối với bạn
Có GitHub account . Nếu chưa có thì đăng kí tại đây.
Có Heroku account. Nếu chưa có thì đăng kí tại đây.
Dùng Windows. Nhưng nếu không thì cũng chả sao tại tụi nó cũng từa tựa nhau.
Bước 1: Tạo web user interface — Hello World trước tiên
Bước 2: Persistence — Tạo một database
Bước 3: Kiểm tra những thay đổi với website
Bước 4: Gửi email notification
Bước 5: List output trên web page
Bước 6: Triển khai
Bước 1: Tạo web user interface — Hello World trước tiên
Trước tiên, chung ta sẽ triển khai một ứng dụng đơn giản vào Heroku. Nó sẽ là tiền thân của web user interface (#4 trong cái component list). Để có thể cho ra một trang web, ta có thể dùng tới HTML page nhưng như vậy lại cần có web server. Nói cách khác, Khi bạn type vào URL của cái website, một program sẽ cần phải xử lí request và cung cấp nội dung cho HTML file. Bạn có thể tạo ra mini web server với Flask Python librar và cũng là điều mà chúng ta sẽ làm.
Tạo ra folder với directory name là webchecker
Cài Flask library. Enter command: npm Flask.
Tạo ra Python program sau đây với và đặt tên là showchecks.py:
import os
from flask import Flask, request
app = Flask(__name__) #create an instance of the Flask library
@app.route('/hello') #whenever this webserver is called with <hostname:port>/hello then this section is called
def hello(): #The subroutine name that handles the call
output = 'Hello World'
return output #Whatever is returned from this subroutine is what is returned to the requester and is shown on the browser page
if __name__ == '__main__':
port = int(os.environ.get('PORT', 5000)) #The port to be listening to — hence, the URL must be <hostname>:<port>/ inorder to send the request to this program
app.run(host='0.0.0.0', port=port) #Start listening
Trước khi bạn triển khai nó lên Heroku, hãy test nó bằng máy tính của mình. Bạn có thể dùng các bước sau:
Sau khi đã chắc chắn thì bạn đã có thể triển khai nó lên Heroku. Trước đó, ta cũng sẽ cần cung cấp một số file để hỗ trợ Heroku hiểu rõ thêm về ứng dụng của bạn.
requirements.txt cho list của non-standard library dependencies. Dùng để add những libraries mới mà lại không phải là Python Standard Library (phải dùng Tool như “PIP” để cài đặt)
Procfile, vốn là Python script để chạy khi website được call – Nhớ là phải update nó nếu bạn thay đổi Python file.
runtime.txt, chính là phiên bản thật của Python để dùng
Bạn có thể triển khai trong command line theo những bước sau:
Với command #1 (heroku create…), phần “webechecker01” là một unique name mà bạn cần cung cấp cho name của app.
Command #3 (git status) sẽ cho biết file nào sẵn sàng để triển khai. Hãy luôn chắc chắn là tất cả file đều có mặt đầy đủ, nếu chưa thì add thêm chúng vào bằng git add <filename>.
Và giờ bạn đã có thể check website của mình: <application name>.herokuapp.com/hello
À mà cũng nên bảo đảm rằng bạn vẫn có thể xem được logs nhé. Xem bằng chạy command
heroku logstrong webchecker directory.
Nếu mọi thứ không diễn ra như ý muốn thì bạn sẽ phải dừng và kiểm tra lại. Hãy dùng https://dashboard.heroku.com để biết rõ hơn nguyên nhân.
Step 2: Persistence — Tạo một database
Để có thể tạo ra thêm nhiều phần mềm hữu ích khác bạn sẽ cần tới data store. Đây chính là lúc dịch vụ Postgres database tỏa sáng. Bạn sẽ cần phải triển khai dịch vụ của Heroku database, tạo ra table rồi mới có thể kết nối code của bạn đến với database (để test)
Để có thể triển khai một database service thì trước hết ta cần phải tạo ra nó bằng command sau:
heroku addons:create heroku-postgresql:hobby-dev
Tiếp theo, truy cập vào database từ command line và tạo ra table của riêng bạn. Lưu ý là database sẽ được xây trên dịch vụ đám mây của Heroku. Tuy nhiên bạn vẫn có vào được nhờ vào command line. Để log vào database thông qua console, chạy command heroku pg:psql. Nhưng phải nhớ là bạn bắt buộc làm nó trong webchecker folder thì Heroku mới hiểu là database này dành cho webchecker site.
Dùng command `/d` để xem list của tables type
Nhằm tạo ra một table, bạn sẽ phải dùng SQL statement bình thường. Và cho webchecker program, chúng ta sẽ làm một table với 4 cột như sau:
ID – Tự động tạo cho mỗi entry (dùng type “serial”)
Website – website để theo dõi
Emailaddress – địa chỉ email để gửi notification khi có thay đổi diễn ra
Lasthashcode- chúng ta sẽ không lưu trữ nguyên cả bản copy của webpage mà thay vào đó sẽ tạo ra hash dựa trên HTML của webpage và so sánh chúng. Nó sẽ giúp tiết kiệm lượng thông tin lưu trữ nhưng sẽ không phản ánh hết những thay đổi đã xảy ra.
Lastchangedate – thời điểm mà sự thay đổi diễn ra.
Để tạo table như trên, ta sẽ điền command vào trong Heroku Postgres database console:
Nếu bạn gặp phải vấn đề bị thiếu libraries thì thêm chúng vào bằng command line pip install <library>
Giờ ta sẽ kết nối chúng tới database với những dòng code:
import http.client
import hashlib
import psycopg2
from psycopg2.extras import RealDictCursor
import traceback
import urllib.parse
import pprint
import os
urllib.parse.uses_netloc.append("postgres")
url = urllib.parse.urlparse(os.environ["DATABASE_URL"])
dbConn = psycopg2.connect( database=url.path[1:], user=url.username, password=url.password, host=url.hostname, port=url.port)
dbCur = dbConn.cursor(cursor_factory=RealDictCursor)
def getCurrentWebsiteHash(weburl):
print("getting url:"+ weburl)
httpConn = http.client.HTTPSConnection(weburl) #Create connection object
httpConn.request('GET', weburl) #Get the website
resp = httpConn.getresponse()
data = resp.read() #Get the webdata into a string object
hash_object = hashlib.md5( data ) #Createa hash code
print(hash_object.hexdigest()) #print hash code
return hash_object.hexdigest()
def getWebList():
rows = []
try:
dbCur.execute("select * from webcheckerdb" ) #Get all records from database
rows = dbCur.fetchall()
except:
print ("error during select: " + str(traceback.format_exc()) )
return rows
def checkWebList(weblist):
for webrecord in weblist: #Loop through each record in database
pprint.pprint(webrecord)
currWebHash = getCurrentWebsiteHash( webrecord['website']) #Get the current websites latest hash code
if currWebHash != webrecord['lasthashcode']:
print( 'Website ' + webrecord['website'] + ' has changed ')
try:
#If there is a change, print out the change, but also update the database so that next time
#the message wont get triggered again
dbCur.execute("update webcheckerdb set lasthashcode ='" + str(currWebHash) + "' where id = '" + str(webrecord['id']) +"'" )
dbConn.commit()
print( 'Website hash updated for next time')
except:
print ("error during update: " + str(traceback.format_exc()) )
if __name__ == "__main__":
weblist = getWebList()
checkWebList( weblist )
Tuy vậy, nếu thử chạy chúng bạn sẽ thấy xuất hiện lỗi ngay – `KeyError: ‘DATABASE_URL’`. Đó là vì Python code của bạn đang tìm địa chỉ của web trên Postgres database host bởi Heroku. Sau này thì việc này sẽ được tự động update cho bạn trên server nhưng trên máy tính của bạn thì phải tự cập nhật bằng tay theo 2 bước sau:
Vào heroku config
Chỉnh DATABASE_URL=<the database string listed from “heroku config”>
Bước 4: Gửi email notification thông báo về thay đổi
Bước cuối cùng là gửi email. Để làm được diều này, bạn sẽ phải cài thêm một Addon với tính năng gửi mail – bạn có thể kiếm chúng trên marketplace của Heroku: https://elements.heroku.com/addons
Bạn có thể thêm nó vào app của mình bằng command line:
heroku addons:create sendgrid:starter
Trước khi sử dụng, bạn cũng sẽ cần tạo một API key, Double click trên SendGrid component và vào Settings->API Key->Create Key.
Một khi bạn đã có key, copy và paste nó vào command prompt:
heroku config:set SENDGRID_API_KEY=<API key from above>
Tuy nhiên nó chỉ mới được register trên server thôi, bạn cũng cân phải làm bằng tay cho desktop của mình:
set SENDGRID_API_KEY=<API Key from above again>
Cuối cùng bạn đã có thể test thử trong Python script gọi là sendmail.py. Để cài library đó, dùng pip install sendgrid:
import sendgrid
import os
from sendgrid.helpers.mail import *
def sendemail(recipient, emailSubject, body):
sg = sendgrid.SendGridAPIClient(apikey=os.environ.get('SENDGRID_API_KEY'))
from_email = Email("heroku@myapp.com")
to_email = Email(recipient)
content = Content("text/plain", body)
mail = Mail(from_email, emailSubject, to_email, content)
response = sg.client.mail.send.post(request_body=mail.get())
print("### Email sent to: "+ recipient + " ###")
print(response.status_code)
print(response.body)
print(response.headers)
if __name__ == "__main__":
sendemail('email@me.com', "hello world", "you have mail!")
Để kiểm tra xem mail được gởi hay chưa, bạn hãy vào lại SendGrid dashboard và kiểm tra mục Statistics Overview :
Nhớ là lúc check mail thì bạn cũng phải check spam luôn nhé.
Một khi mọi thứ đều hoạt động đúng theo kế hoạch thì bạn giờ chỉ cần thêm 2 dòng code nữa vào checkwebsite.py script thôi:
import sendmail #import the send email subroutine you wrote above
...
#call the subroutine after find the hashcode has changed
sendmail.sendemail(webrecord['emailaddress'], 'Website changed', webrecord['website'] + ' changed')
import http.client
import hashlib
import psycopg2
from psycopg2.extras import RealDictCursor
import traceback
import urllib.parse
import pprint
import os
import sendmail #import the send email subroutine
urllib.parse.uses_netloc.append("postgres")
url = urllib.parse.urlparse(os.environ["DATABASE_URL"])
dbConn = psycopg2.connect( database=url.path[1:], user=url.username, password=url.password, host=url.hostname, port=url.port)
dbCur = dbConn.cursor(cursor_factory=RealDictCursor)
def getCurrentWebsiteHash(weburl):
print("getting url:"+ weburl)
httpConn = http.client.HTTPSConnection(weburl) #Create connection object
httpConn.request('GET', weburl) #Get the website
resp = httpConn.getresponse()
data = resp.read() #Get the webdata into a string object
hash_object = hashlib.md5( data ) #Createa hash code
print(hash_object.hexdigest()) #print hash code
return hash_object.hexdigest()
def getWebList():
rows = []
try:
dbCur.execute("select * from webcheckerdb" ) #Get all records from database
rows = dbCur.fetchall()
except:
print ("error during select: " + str(traceback.format_exc()) )
return rows
def checkWebList(weblist):
for webrecord in weblist: #Loop through each record in database
pprint.pprint(webrecord)
currWebHash = getCurrentWebsiteHash( webrecord['website']) #Get the current websites latest hash code
if currWebHash != webrecord['lasthashcode']:
print( 'Website ' + webrecord['website'] + ' has changed email to ' + webrecord['emailaddress'])
#call the subroutine after find the hashcode has changed
sendmail.sendemail(webrecord['emailaddress'], 'Website changed', webrecord['website'] + ' changed')
try:
#If there is a change, print out the change, but also update the database so that next time
#the message wont get triggered again
dbCur.execute("update webcheckerdb set lasthashcode ='" + str(currWebHash) + "' where id = '" + str(webrecord['id']) +"'" )
dbConn.commit()
print( 'Website hash updated for next time')
except:
print ("error during update: " + str(traceback.format_exc()) )
if __name__ == "__main__":
weblist = getWebList()
checkWebList( weblist )
Bước 5: Lập list cho output trên web page và set thời gian cho job
Giờ chúng ta cần liệt kê ra các output trên webpage. Bạn sẽ cần tới querying database rồi cycling và hiển thị chúng. Lấy ví dụ là ‘Hello World’ code ở trên, nó sẽ thứ hiện quá trình modification. Bạn có thể test nó với path mà tôi đã tạo ra là: http://localhost:5000/list
import os
from flask import Flask, request
import hashlib
import psycopg2
from psycopg2.extras import RealDictCursor
import traceback
import urllib.parse
import pprint
app = Flask(__name__) #create an instance of the Flask library
urllib.parse.uses_netloc.append("postgres")
url = urllib.parse.urlparse(os.environ["DATABASE_URL"])
dbConn = psycopg2.connect( database=url.path[1:], user=url.username, password=url.password, host=url.hostname, port=url.port)
dbCur = dbConn.cursor(cursor_factory=RealDictCursor)
@app.route('/list') #whenever this webserver is called with <hostname:port>/hello then this section is called
def list(): #The subroutine name that handles the call
output = 'Check status:'
rows = []
try:
dbCur.execute("select * from webcheckerdb" ) #Get all records from database
rows = dbCur.fetchall()
for webrecord in rows: #Loop through each record in database
output = output + '<BR> ' + pprint.pformat(webrecord)
except:
output = "error during select: " + str(traceback.format_exc())
return output #Whatever is returned from this subroutine is what is returned to the requester and is shown on the browser page
@app.route('/hello') #whenever this webserver is called with <hostname:port>/hello then this section is called
def hello(): #The subroutine name that handles the call
output = 'Hello World'
return output #Whatever is returned from this subroutine is what is returned to the requester and is shown on the browser page
if __name__ == '__main__':
port = int(os.environ.get('PORT', 5000)) #The port to be listening to — hence, the URL must be <hostname>:<port>/ inorder to send the request to this program
app.run(host='0.0.0.0', port=port) #Start listening
Bước 6: Triển khai
Bước cuối cùng là triển khai tất cả mọi thứ lên Heroku và lên schedule để nó check mail.
Đến bước này, bạn sẽ phải có những file sau:
Procfile — file hướng tới showchecker.py
requirements.txt — file chứa library dependencies
runtime.txt — phiên bản của python
showchecker.py —python code hiển thị database output trên web thông qua <your appname>.herokuapp.com/list
checkwebsite.py —python code kiểm tra những thay đổi trên website.
Đối với requirements.txt bạn sẽ cần update các bản libraries mới nhất
Flask==0.12
psycopg2==2.6.2
sendgrid==3.6.3
Triển khai tất cả lên Heroku:
git add *.* *
git commit -m “deployment”
git push heroku master
Test từng component:
Vào <your app name>.herokuapp.com/hello
Vào <your app name>.herokuapp.com/list
Nếu có bất cứ errors nào thì chạy heroku logs trong command line để xem có vấn đề gì rồi chạy checkwebsite.py trực tiếp trên Heroku để bảo đảm không còn bị lỗi gì khác.
Để làm điều đó, bạn chỉ cần type:
heroku run python checkwebsite.py
Và giờ thì ta đã có thể lên schedule được rùi (tất nhiên là cần phải có Addon)
heroku addons:create scheduler:standard
Chúc mừng bạn đã thành công trong việc làm ra một ứng dụng với chức năng gửi mail nhắc mỗi khi có thay đổi diễn ra trên web page, bạn có thể dùng command line `python checkwebsite.py` để chạy chương trình.
Điều hành một startup khác với điều hành một công ty lớn rất nhiều. Khi qui mô công ty còn nhỏ, các nhà sáng lập có thể dễ dàng nắm bắt hoạt động của công ty và đảm bảo mọi công việc quan trọng đều được thực hiện. Nhưng đến khi startup phát triển và mở rộng, nhà sáng lập không thể nào nhúng tay tham gia từ A-Z nữa. Nhiều công ty dần xa rời khách hàng; qui trình làm việc trở nên trì trệ; tuyển dụng nhân sự mắc phải sai lầm. Chúng ta đều đã chứng kiến những sai lầm này, kể cả ở những startup xuất sắc.
Phép màu của Amazon là ở chỗ: dù là một công ty khổng lồ, nhưng ở một số khía cạnh chủ chốt, Amazon vẫn vận hành như một startup do nhà sáng lập điều khiển. Điều này một phần là vì Jeff Bezos, CEO của Amazon, có ảnh hưởng rất lớn đến văn hoá của toàn bộ công ty. Bên cạnh đó, Bezos đã phát triển một số công cụ độc đáo nhằm duy trì và củng cố những giá trị cốt lõi của mình trong công ty, chẳng hạn như:
1. Chú trọng vào khách hàng
Amazon có một qui trình phát triển sản phẩm độc nhất vô nhị: trước khi bắt đầu một dự án mới, giám đốc sản phẩm sẽ soạn một thông cáo báo chí nội bộ để ‘công bố’ về sản phẩm đó. Cách tiếp cận trái với qui trình thông thường này giúp cho cả đội ngũ phát triển hiểu rõ giá trị của sản phẩm đối với khách hàng (VD: sản phẩm này giải quyết vấn đề gì cho người dùng). Một cựu giám đốc ở Amazon đã mô tả phương pháp này như sau: “Chúng tôi muốn đi ngược và bắt đầu từ phía khách hàng thay vì bắt đầu từ ý tưởng sản phẩm rồi sau đó cố đóng khung khách hàng vào sản phẩm đó.”
Nếu như cả đội ngũ làm sản phẩm không nghĩ ra được một thông cáo báo chí đủ thu hút, điều đó có nghĩa hoặc là họ cần dành thêm thời gian suy ngẫm thêm, hoặc là sản phẩm của họ không đáng được phát triển.
Bài tập viết một thông cáo báo chí ngắn gọn súc tích là một bài tập hay giúp tóm tắt nhu cầu của khách hàng và lợi ích sản phẩm mang lại. Tuy nhiên, một câu hỏi khác được đặt ra là: làm thế nào để đội ngũ làm sản phẩm có thể thực sự hiểu được những nhu cầu và thách thức mà khách hàng mang lại. Để rút ngắn khoảng cách giữa các nhà quản lý và người tiêu dùng, Amazon để cho họ thường xuyên làm công tác dịch vụ khách hàng. Tại AbeBooks, chúng tôi cũng áp dụng chính sách tương tự.
2. Cơ cấu tổ chức
Amazon có một qui luật khá nổi tiếng: Qui luật Hai chiếc pizza – nếu một nhóm dự án có thể ăn nhiều hơn 2 cái pizza, nhóm đó có quá nhiều người. Để giải quyết vấn đề này, họ sẽ chia nhỏ dự án và đội ngũ thực hiện. Từ đó các nhóm sẽ tinh gọn, hoạt động linh hoạt hơn và quản lý dễ dàng hơn.
Để hỗ trợ các nhóm làm việc với nhau, mỗi một sản phẩm ở Amazon đều phải có API (Application Programming Interface – giao diện lập trình ứng dụng), giống như khi phát triển sản phẩm cho một khách hàng ở ngoài. Với API, các đội dự án có thể hoạt động mà không phụ thuộc vào tốc độ làm việc của nhau cũng như bàn giao công việc cho nhau dễ dàng hơn. Nó thể hiện tầm nhìn của Bezos về một công ty phân quyền, trong đó các nhóm nhỏ có thể độc lập sáng tạo và hoạt động mà không bị các nhóm hay cá nhân khác chi phối.
3. Tuyển dụng
Khi một công ty phát triển và mở rộng đến một mức độ nào đó, nhà sáng lập không thể nào tham gia vào mọi quyết định của công ty nữa. Lúc này công ty cần phải có đội ngũ nhân sự có năng lực.
Trước đây, Bezos đã áp dụng chương trình tuyển dụng thông qua “bar raisers” tại Amazon. Đây là những nhân viên có khả năng nhìn người tốt và phụ trách phỏng vấn các ứng viên ứng tuyển vào Amazon. Họ có quyền phản đối bất kì một ứng viên nào, kể cả khi ứng viên ứng tuyển vào các vị trí hoàn toàn không thuộc lĩnh vực chuyên môn của họ. Bezos đã nói rằng chương trình này đã giúp loại bỏ bớt những ứng viên “lệch với văn hoá” của Amazon và giúp công ty có các quyết định tuyển dụng đúng đắn bằng cách chỉ tuyển người khi nhiều nhân viên ở các lĩnh vực đa dạng chấp thuận người đó.
Một chiến thuật dùng người khác của Amazon là giữ chân những nhà sáng lập mà họ có được khi mua lại các công ty khác. Ví dụ: vào năm 1998, khi mua lại Junglee, Amazon cũng thu nhận nhà sáng lập của công ty này là Mike George. Từ đó trở đi, Bezos đã rất nhiều lần tin tưởng giao cho George rất nhiều dự án mới như đưa marketplace ra các thị trường hay điều hành dự án nền tảng thanh toán quốc tế. Hiện Mike George đang phụ trách dự án Alexa.
Giữ chân các nhà sáng lập không phải là điều dễ làm: khi một ai đó sáng lập ra một công ty, họ muốn làm tướng chứ không muốn làm lính. Các nhà khởi nghiệp thường không hài lòng khi công ty mua lại startup của mình lại muốn dạy dỗ họ cách làm thế nào để điều hành doanh nghiệp mà chính họ “mang nặng đẻ đau” và “nuôi lớn.” Bí quyết để Amazon thành công trong việc giữ chân những nhà sáng lập là cho họ không gian để thoả sức tung hoành.
Hỡi những nhà sáng lập của các startup đang còn ở giai đoạn phát triển ban đầu, bạn có thể dành nhiều thời gian hơn cho việc nghĩ cách làm sao để đưa được sản phẩm của mình ra thị trường hay thu hút được 1,000 hoặc 100,000 khách hàng đầu tư mà chưa để tâm tới các thách thức liên quan tới việc mở rộng qui mô công ty. Thế nhưng một số những công cụ ở trên có thể giúp ích rất nhiều cho startup của bạn kể cả khi bạn mới có 20-30 nhân viên. Hãy nhớ rằng không bao giờ là quá sớm để bắt đầu nghĩ về việc áp dụng những qui trình và công cụ đúng đắn nhằm giúp công ty phát triển mà không bị chệch hướng.
Thực ra ông nào cũng muốn cả 2 tốt cả, nhưng tui nói thật không có nhiều lựa chọn đâu, nhân dịp hôm qua Jackma đăng đàn chia sẻ về cách xây dựng Taobao, Tmall những năm 2003, để tui kể hầu các thím mấy chuyện liên quan đến Marketing & Product.
Chuyện thứ 1:
Taobao 2 tuần đầu launch thì toàn bộ nhân viên tự đăng, rồi anh em trong công ty cũng tự mua, không hề có người ngoài, 1 tháng sau thì khách hàng đăng đồ lên bán, nhân viên cũng phải mua cho khách để họ tin là cái site này cứ đăng lên là bán được.
Vatgia giai đoạn đầu anh Điệp thuê 40 nhân viên ngồi copy paste các tin đăng ở nơi khác về. Dần dần traffic to lên, dân tình lại thấy Vatgia có nhiều khách xem, lại tự động vào đăng tin thôi.
Lúc tôi khởi nghiệp 2007-2008 trang Vatgia cùi lắm, cơ mà traffic rất khủng, bố đứa nào dám bảo là sản phẩm không tốt khi nó là platform rao vặt lớn nhất Viêtnam.
Chuyện thứ 2:
Thững ngày đầu tiên, phần lớn nội dung của YouTube là không có bản quyền. Muốn xem một tập phim, thay vì phải down từ torrent thì người dùng có thể vào YouTube. Thế là Youtube dần dần trở thành platform video lớn nhất thế giới, khi có thế lực rồi thì lại quay ra giết hết bọn up video không có bản quyền.
Ngày đầu tiên mình vào HDViet (tầm năm 2014) thấy website rất lởm, quảng cáo chiếm 50% màn hình, sản phẩm tệ thật đó, nhưng vẫn là platform xem phim lớn nhất Viêtnam đơn giản vì HDViet có một kho phim “không bản quyền” mà không ai có 🙂) Dần dần có lực rồi thì các anh lại khéo léo mua bản quyền, các khó khăn được giải quyết.
Vào 1 ngày đẹp trời năm 2016, nghe bảo mấy Founder đẹp trai chán phim nên đành bán hết, bỏ túi chơi chơi 7 triệu. Vậy nên soái ca Jimmy H. Tran đánh Poker lúc nào cũng bluff mình, có phải đây là chiến lược Marketing lấy thịt đè người của giới startup không nhỉ? Nguyen Dangcong Dzung NguyenLuân Nhan Thế
Chuyện thứ 3
Tuần trước có 7-Eleven, trước đó nữa là StarBuck vào ngày khai trương đều thuê người xếp hàng. Dân tình cứ nghĩ là Cafe StarBuck ngon hơn Trung Nguyên nên cũng vào mua thử, ờ thì thấy nó cũng đắng đắng đắng ngọt ngọt dễ uống hơn Trung Nguyên, chắc là nó ngon hơn thật.
Thực tế là: Làm mẹ gì có chuyện cafe StarBuck ngon hơn Trung Nguyên. Nếu có là do con mẹ thằng bạn nó bảo thế thôi 🙂) Chân lý là Marketing Win, còn cả 2 sản phẩm thì cũng chỉ là nược ngọt có vị cafe mà thôi.
Chuyện thứ 4:
Ông Leo Trieu là 1 coder bình thường (vì mình không biết code, thấy hắn có mindset làm business, phần Code vì thế chắc cũng chỉ hơn mình một tí
😛) vậy mà năm ngoài launch quả khóa học 30 ngày thu về được 2 tỉ, cách đây 2 hôm lại khoe mình là khóa thứ 2 em mới launch được 2 ngày mà đã được 1 tỉ.
Người trong nghề, không cần hỏi thì tui cũng biết hắn chỉ dành 2 tháng code, quay video màu mè làm cho course thú vị và dễ hiểu, còn lại 10 tháng là đi làm marketing, xây dưng email list và thiết kế rất bài bản “Phễu Bán hàng”
Hỏi: Thế ông Leo Triệu thành công là do code tốt hay là marketing tốt? Tự đập đầu vào gối mà trả lời đi
Chuyện trong nhà bây giờ mới kể
Incredible DesignBold hồi đi mẫu giáo bé (hạ sinh 31/10 năm ngoái) về sản phẩm thì thua kém DesignBold Đại học chữ to bây giờ nhiều lắm. Đứa nào bảo DesignBold không “tốt nghiệp đại học” sau khi bọn tui đã ra hơn 30 tính năng và fix hơn 1000 cái bugs trong vòng vẻn vẹn 5 tháng?
Ngày xưa khi mà sản phẩm chưa phải là tốt lắm, vậy mà bọn tui bán được 3 tỉ trong vòng 12 ngày, vì bọn tui khá hiểu thị trường Global, biết target đúng tập khách hàng (tôn trọng bản quyền và thích các sản phẩm đơn giản tiện lợi)
Ngược lại, về mặt sản phẩm, DesignBold bây giờ ngon gấp bội lần, thế mà team Vietnam bán hơn 1 tháng nay không bằng 1 ngày hồi xưa, đơn giản là chúng ta chưa hiểu thị trường: người Vietnam (chủng người khá đặc biệt trên thế giới: Nghèo nhưng lại khó tính, đấy là chưa kể nhiều phẩm chất vô cùng đáng yêu như “thích dùng chùa”, “không tôn trọng bản quyền hình ảnh”, “không thích dùng phần mềm trả phí”
Càng nghĩ lại càng thương mấy anh em như Haravan 1Office TopDevPancake Facebook Tools Cộng đồng Landingpage
Hay là mấy anh em rủ mẹ nhau ra đảo sống nhỉ
Kết luận
Vậy đó, khi không bán được hàng thì đừng có xúm vào mà chửi mấy thằng làm sản phẩm nha bay. Thím nào là Product Builder, Maker, Developer, Designer hay bị bọn làm Business, Marketing, Sales ném đá chê là sản phẩm không tốt nên không bán được thì tag nó vào đây, thực ra là tụi nó làm marketing kém chứ không phải mình làm sản phẩm không tốt đâu. Làm Marketing tốt hay không tốt thì thằng khách hàng nó không chỉ ra được, nhưng sản phẩm mà lỗi thì đứa nào cũng có thế chém mình tung xác.
Vào ngày 24/06 vừa qua, sự kiện TopDev Techtalk Thuật toán – Tế bào gốc của AI, Machine Learning, Blockchain tại Tp.HCM đã chào đón gần 250 khách tham dự, để lại nhiều dấu ấn nhờ những câu chuyện xoay quanh nền tảng Thuật toán của các diễn giả.
Đầu tiên phải kể đến ấn tượng từ những định nghĩa nhất về Thuật Toán dưới sự dẫn dắt của anh Phạm Nguyễn Sơn Tùng – người sáng lập ra Bio-Coding, Giảng viên trường Đại Học Khoa Học Tự Nhiên. Đến với TopDev TechTalk lần này, anh Tùng chia sẻ một bất ngờ lớn ngay từ việc định hướng Thuật Toán từ cơ bản cho đến chuyên sâu dưới cái nhìn sư phạm, phổ cập lộ trình học Thuật Toán đúng đắn nhất cho các bạn học sinh – sinh viên và người đang đi làm, giúp người xem tự sắp xếp được một lịch học “thuật toán cá nhân” chuẩn cho chính mình.
Lê Yên Thanh – Backend Developer của Umbala, cái tên “nóng” nhất làng công nghệ Việt Nam thời gian qua cũng xuất hiện với những tự sự về mối tương duyên với nghề lập trình, quan điểm về tương lai của AI lẫn các dự án anh đang trực tiếp túc trực. Lê Yên Thanh đã mang đến bầu không khí pha lẫn sự hài hước lẫn thán phục với cá tính của Yên Thanh và các thành tích mà Thanh đạt được trong những năm tháng còn ngồi trên ghế nhà trường.
Khán giả giao lưu đặt câu hỏi cho 3 diễn giả
Anh Nhân Nguyễn – Kỹ sư của Walmart Labs, cựu kĩ sư của Google tận tình giải đáp thắc mắc
Sự kiện TopDev Techtalk Thuật toán – Tế bào gốc của AI, Machine Learning, Blockchain sẽ tiếp tục
Thời gian & địa điểm: 17h30 – 21h30 ngày 02.07.2017 tại The Vuon Luxury Garden Office D2 Giảng Võ, Q. Ba Đình, Hà Nội.
Hotline/ Liên hệ hợp tác:
– ngoc.do@applancer.net (Ms. Ngọc) | 0944 685 243
– event@applancer.net (event team) | 08 6273 3497
Đã từng có không ít các thông tin bàn luận xoay quanh vấn đề lỗi thiết kế và tính không nhất quán của lập trình ngôn ngữ PHP. Vào năm 2012, một bài viết chia sẻ từ blogger Eevee đã được viết với tiêu đề “PHP: Một ngôn ngữ có thiết kế rất tồi”. Từ đó cuộc tranh luận về nhược điểm của ngôn ngữ lập trình này bắt đầu nhiều hơn: “Không có một triết lý thiết kế rõ ràng”, “PHP không tập trung như các ngôn ngữ khác”, “PHP thật tệ”…
Tuy nhiên, chúng ta tự hỏi với vô số những ý kiến trái chiều ấy tại sao PHP lại vẫn được nhiều người sử dụng và phổ biến đến vậy? Theo W3Techs, có đến 82% website trong thế giới internet dùng ngôn ngữ lập trình PHP. Ngay cả các trang web nổi tiếng như Wikipedia, Facebook, WordPress…cũng đều đang được chạy bởi chính ngôn ngữ này.
Vậy điều gì đã khiến độ hot của PHP vẫn chưa hề giảm nhiệt?
Phổ biến và dễ tiếp cận
Theo CEO của công ty Zend Technologies, ông cho biết: “PHP cho đến nay là ngôn ngữ lập trình web phổ biến nhất”. Với Josh Lockhart, một nhà phát triển web tại Media Campaigns, ông nhấn mạnh PHP được xem là một trong những ngôn ngữ lập trình web đơn giản và dễ diếp cận nhất ngày nay.
Với tất cả những gì liên quan đến website, PHP đều có thể được áp dụng vào. Cấu trúc và câu lệnh của PHP cũng giống với C, Java nên bạn có thể dễ dàng nắm vững trong một thời gian ngắn nếu thường xuyên thực hành nhiều bài tập và dự án nhỏ. Xét về mức độ hiệu suất, khả năng mở rộng thì PHP được đánh giá rất cao; hơn nữa chi phí lại luôn luôn rất thấp. Facebook ban đầu được xây dựng bằng ngôn ngữ PHP và về sau đã thống lĩnh trang mạng xã hội vượt mặt cả trang Myspace đã được ưa chuộng rất nhiều trước đó. Hiện tại thì Facebook chính là trang web có lượng người truy cập lớn thứ 2 trên thế giới.
Sự lớn mạnh của cộng đồng PHP đã chứng tỏ mức độ phổ biến và chất lượng của chính ngôn ngữ này. Thêm vào đó, các phiên bản cải tiến mới cũng như các version cập nhật đã giúp cho PHP càng trở nên linh hoạt trong việc hoàn thiện.
PHP còn hỗ trợ nhiều Framework mang tính năng mạnh mẽ: Laravel, Yii, Phalcon, CakePHP, Zend,… và mô hình OOP thích hợp. Với các phiên bản phát triển mới trong tương lai thì PHP sẽ cải tiến thêm hiệu suất mang khả năng ứng dụng cao.
Nhu cầu tuyển dụng lớn
Sau Java thì PHP là ngôn ngữ lập trình phổ biến đứng trong top 5 ngôn ngữ lập trình được sử dụng nhiều nhất trong các năm qua theo khảo sát của StackOverFlow.
Khi gõ tìm kiếm nhanh trên trang web việc làm công nghệ Dice.com gần đây thì trang đã cho hiển thị khoảng 19,072 công việc liên quan đến PHP, đứng top 3 chỉ sau Java và Python. Điều này cho thấy rất rõ PHP đang không ngừng gia tăng số lượng công việc gần bằng các ngôn ngữ lập trình khác.
Ngay tại Việt Nam ở 3 khu vực thành phố lớn có rất nhiều công ty đang tuyển dụng việc làm it PHP Developer.
Cuối cùng, bạn đã hiểu lý do tại sao mười người mười ý nhưng độ hot PHP vẫn chưa hề giảm rồi chứ?
Gặp gỡ anh Chu Sĩ Nguyên – Phó Tổng Giám Đốc của SK-Global, một startup khởi nghiệp năm 2016, chuyên xây dựng những Giải Pháp phục vụ cộng đồng với thế mạnh về kỹ thuật thực tế tăng cường (AR), cũng như thâm niên lâu năm trong lĩnh vực Outsourcing trong các lĩnh vực tài chính tiền tệ
Hãy cùng TopDev lắng nghe những chia sẻ thực tế đến từ quá trình hơn 10 năm làm việc.
Q: Chào anh, anh có thể chia sẻ những khó khăn trong quá trình Startup không?
Khó khăn này có lẽ là khó khăn chung của các Startup, đó là việc bài toán cân bằng giữa outsourcing và product. Làm outsourcing quá nhiều thì dễ đánh mất lý tưởng của công ty, còn làm product nhiều thì lại thiếu ngân sách hoạt động.
Hiện tại, giải pháp mà SK Global hướng đến là tìm ra mô hình mới, tách bạch rõ ràng giữa 2 team Product và Outsourcing trong nội bộ công ty, mỗi team có một sứ mệnh rõ ràng chứ không trộn lẫn như bây giờ.
Q: Anh đánh giá như thế nào về các dự án Outsourcing Việt Nam hiện nay?
Mình không nói về các dự án Việt Nam mà tập trung vào các dự án mình đã làm. Nhìn chung giá cả Việt Nam vẫn cạnh tranh được với các nước khác, kể cả Ấn Độ & Trung Quốc. Mình làm rất dàn trải, việc gì cũng làm được nhưng chưa sâu, sâu ở đây có thể hiểu là sâu ở mặt quy trình.
Ví dụ mình chủ yếu chỉ tham gia vào những giai đoạn như phát triển, testing. Những giai đoạn mang đến “linh hồn” và “bản sắc” cho dự án như lên ý tưởng, thiết kế, core library thì hầu như rất hiếm khi được tham gia.. Đến bây giờ, sau 10 năm thì thực tế này vẫn đang tiếp diễn, đối tác tìm đến mình chủ yếu vẫn là do giá thành rẻ.
Q: Một developer muốn vào SK Global thì cần những kĩ năng, kiến thức gì?
Mình tuyển dụng cũng khá nhiều, tùy theo mục đích là làm Product hay làm Outsourcing. Trong đó, hai yếu tố quan trọng là khả năng tự học và khả năng làm việc độc lập. Các công ty khác đánh giá cao khả năng làm việc theo nhóm nhưng theo quan điểm của SK Global thì người làm việc độc lập được thì mới làm teamwork được. Còn khả năng tự học là điều chắc chắn vì SK Global không tuyển một bạn biết hết tất cả mà cần các bạn có nền tảng tốt để có thể tự học được.
Q: Với các dự án riêng của SK Global thì anh có mong đợi kĩ năng/ công nghệ nào đặc biệt từ phía lập trình viên?
Tất nhiên khi tuyển dụng mình phải ưu tiên ứng viên có kĩ năng đáp ứng được nhu cầu công việc lúc đó, nhưng trên hết ứng viên phải có nền tảng tốt về lập trình và thiết kế lập trình. Ngoài ra mình cũng ưu tiên những bạn vững về Javascript, mình nghĩ Javascript sẽ được cộng đồng hậu thuẫn nhiều trong tương lai.
Q: Một lập trình viên làm Product và một lập trình viên outsource thì khác nhau ở điểm nào?
Trong 1 năm làm việc vừa qua, mình đã nhận ra là khác nhau hoàn toàn. Bản thân mình cũng xuất thân từ Outsourcing, thì cái khó nhất của các bạn Outsourcing trước khi chuyển qua Product là tư duy sáng tạo.
Mình đã quen với việc làm bài tập từ thời còn đi học: chỉ làm những gì mà người ta yêu cầu, chỉ làm những gì mình thấy rõ ràng để làm. Thời gian đầu các bạn làm ở SK Global thì hầu hết các bạn đều không làm được vì chỉ nghĩ công việc của mình như là một coder, nhưng khi làm Product các bạn phải can thiệp vào tất cả các khâu từ giai đoạn ý tưởng, thiết kế đến khi thành phẩm.
Các bạn phải tự đóng vai trò là khách hàng, tự đặt ra những chuẩn mực cho dự án, học từ những feedback trực tiếp từ khách hàng, chịu thất bại và tiếp tục phát triển tiếp. Quan trọng nhất phải có ý thức mình là chủ sở hữu của sản phẩm để có thể tâm huyết tạo ra dược sản phẩm tốt nhất. Điều này khác rất nhiều so với làm Outsourcing.
Q: Anh có ví dụ nào thực tế đến từ Product mà SK Global đang làm không?
SK-GLOBAL sắp ra mắt ứng dụng cho phép người dùng thử mắt kính ảo theo thời gian thực ngay trên thiết bị di động. Mình nghĩ mọi người sẽ rất bất ngờ về khả năng mang đến trải nghiệm y như thật của ứng dụng này.
Từ lúc ban đầu khi ý tưởng chưa có, công ty có tổ chức một số buổi brainstorm, hackaton để thu thập ý kiến của mọi người nhưng kết quả không được tốt mấy do mọi người chưa quen với việc tự nghĩ ra cái để làm.
Nhưng dần dần sau khi trải qua tất cả các khâu của dự án, tư duy va cách làm Product của mọi người dần dần được hình thành. Mình nghĩ dự án Product tiếp theo sẽ được hình thành từ chính ý tưởng của các bạn trong công ty.
Q: SK Global có mối quan hệ thân thiết với các công ty Nhật, thì không biết môi trường/ văn hóa làm việc giữa Nhật Bản và Việt Nam có những điểm khác biệt nào, nhất là đối với developer?
Môi trường làm việc thật ra không có gì quá khác biệt trong môi trường Internet như hiện nay. Cơ sở vật chất Việt Nam cũng không thiếu thốn gì so với nước bạn.
Nhưng văn hóa làm việc thì khác. Người Việt Nam có khuỵnh hướng là không đi đến tận cùng, không có nhu cầu sự hoàn hảo, không có lý tưởng làm sao cho sản phẩm của mình là số 1 trên thế giới.
Q: Nguyên nhân nào dẫn đến thực tế này? Có phải vì dev Việt mình chưa có đủ đam mê…?
Đúng vậy, vì các bạn làm Outsourcing, sản phẩm là của người ta nên mình không cần bỏ quá nhiều công để làm cho hoàn hảo. Thứ hai là xuất phát văn hóa của mình là hay tự thỏa mãn, không đến nơi đến chốn. Ngoài ra, nếu trong công ty Outsourcing thì đa phần mình không có điều kiện, không có cơ hội để thực sự tâm huyết với sản phẩm đó.
Q: SK Global có các khóa training nào cho nhân viên?
Hiện tại công ty có gửi các bạn đi training rất nhiều, nhưng không tập trung vào kiến thức lập trình, vì công nghệ phát triển quá nhanh nên các trường khó dạy tốt và cơ bản các bạn cũng có khả năng tự học rồi.
Chủ yếu vẫn là học Marketing và Design.
Q: Ngoài những vấn đề chuyên môn thì anh có thể mô tả thêm về văn hóa công ty?
Mình muốn tạo ra môi trường làm việc có cơ sở vật chất tốt nhất cho các bạn. Thêm nữa, công ty không có rào chắn giữa người lao động và người sử dụng lao động, mình rất dị ứng tạo ra không khí cấp trên, cấp dưới. Dự án là của mọi người, ai cũng có vai trò, sức ảnh hưởng riêng và cùng nhau hoàn thành dự án. SK Global cũng rất flexible về thời gian làm việc.
Thay đổi công việc là điều gì đó dễ khiến chúng ta hoảng sợ vì mức độ mạo hiểm của nó. Càng lớn tuổi, rủi ro khi chuyển sang một lĩnh vực khác càng lớn. Thời điểm bắt đầu là khó khăn nhất vì bạn phải cạnh tranh với người trẻ hơn, thành công hơn. Đừng lo, đừng nảng lòng. Dấn thân vào công nghệ ở tuổi 30 (hoặc bất kỳ độ tuổi nào) cũng có thể trở thành một cuộc phiêu lưu kì thú với những trải nghiệm đáng nhớ, những con người thú vị và những cơ hội tuyệt vời.
Hôm nay là sinh nhật thứ 32 của tôi và tôi đang nhìn lại một năm phiêu lưu của mình…
Khi 20 tuổi, tôi đã từng chắc mẩm rằng, trước 32 tuổi, tôi sẽ có tất cả. Tôi đã tưởng tượng mình trong tương lai là người phụ nữ có một cuộc sống, sự nghiệp tuyệt vời, mang giày gót cao và sở hữu kế hoạch cuộc đời hoàn hảo.
Tôi hiện tại đang mặc chiếc áo T-shirt quá khổ của chồng tôi, và gương mặt makeup từ ngày hôm qua. Tôi có một cuộc sống tuyệt vời mặc dù nó khác với những gì tôi đã lên kế hoạch ban đầu và sự nghiệp của tôi chỉ mới bắt đầu. Tôi hầu như không mang giày cao gót vì tôi thích những đôi thoải mái…
Hành trình đến với công nghệ của tôi là một câu chuyện dài và phức tạp, có cả nước mắt và tuyệt vọng. Ban đầu, tôi đã trở thành một nhà ngôn ngữ học. Mọi thứ đã được lên kế hoạch và tôi đã trở thành một nhà khoa học, đi khắp thế giới, dịch văn bản cổ và giảng dạy tại các trường đại học có uy tín. Sau đó, mẹ tôi bị ung thư và không điều gì trong số đó trở nên quan trọng với tôi. Cuộc sống của tôi đã dừng lại trong 2 năm rưỡi cho tới khi mẹ tôi mất vì ung thư. Tôi sụp đổ hoàn toàn- đại học không thành vấn đề, trình độ của tôi không thành vấn đề, tôi không có kế hoạch nào và tôi đã mất tất cả.
Sau khi mất một thời gian khá dài để ổn định lại cuộc sống, tôi bắt đầu suy nghĩ về việc trở thành Web Designer. Tôi đã làm điều này trong phần lớn cuộc đời của mình nhưng chưa bao giờ nghĩ rằng tôi nghĩ sẽ biến nó thành sự nghiệp thực sự. Vì vậy, tôi bắt đầu tham gia chương trình 2-năm, nơi tôi đã biết đến Manuel Matuzovic – người giáo viên đầu tiên cũng đồng thời là một người bạn, người cố vấn của tôi. Anh đặt ra thách thức cho tôi và nhận ra tham vọng muốn làm cho một cái gì đó của bản thân tôi.
Tôi đã làm việc trong vai trò developer toàn thời gian trong gần một năm và dưới đây là những bài học của tôi khi bắt đầu trở thành developer ở tuổi 30.
Mọi người đều còn quá trẻ!
Khi tôi làm dev lần đầu, tôi là Junior lớn tuổi nhất trong công ty. Đây là một kinh nghiệm rất kỳ quặc, đặc biệt là khi tôi đã từng nắm giữ các vị trí quản lý phụ trách hơn 60 người, trước khi chuyển sang làm developer.
Tôi luôn cảm thấy mình sẽ không bao giờ bắt kịp với các đồng nghiệp của mình những người đã dẫn trước tôi hang ngàn dặm. Cảm giác này kéo dài mãi cho tới khi tôi tìm thấy vị trí thích hợp dành cho mình, thứ tôi thực sự giỏi, cảm giác đó bắt đầu giảm dần từng chút một.
Vì vậy, lời khuyên của tôi là: Trở nên giỏi ở một cái gì đó bạn thích, sự tự tin đi kèm với thực hành.
Hội chứng Imposter là có thật
Bạn thật sự không thể lừa lọc trong ngành lập trình đâu. Gửi code đi để reviews là một cơn ác mộng với những người mắc chứng sợ hãi như tôi. Tôi liên tục cảm thấy như một kẻ thất bại hoàn toàn và không bao giờ có thể làm tốt hơn. Chìa khóa để khắc phục điều này là trò chuyện. Tôi nói chuyện với leader của mình về cảm giác bất an và mong nhận phản hồi của ông về khả năng học hỏi và chất lượng code của tôi. Tôi đặt câu hỏi khi tôi không hiểu điều gì đó và tiếp tục học hỏi từ anh ấy cũng như những người khác. Điều này thực hiện được vì tôi có một ông chủ tốt và những người đồng nghiệp tuyệt vời. Họ khiến tôi cảm nhận được sự tự tin mỗi lần đặt câu hỏi.
Tất cả là về vấn đề con người
Giống như bất kỳ công việc nào khác, việc trở thành một developer là câu chuyện xoay quanh con người. Đồng nghiệp, khách hàng, user của bạn.
Tôi đã gặp một số người tuyệt vời tại hội nghị công nghệ. Ngành công nghiệp này thực sự có một số nhân vật “đáng sợ” và tôi vẫn còn sợ cách họ đối xử với nhau. Tất nhiên, những điều không hay này xảy ra trong ngành công nghệ (cũng như trong các ngành công nghiệp khác) nhưng tôi cảm thấy như có một cuộc tranh luận ở đây và mọi người đều ý thức được những gì họ nói. Chúng ta có rất nhiều thứ để cải thiện và mọi người vẫn đang cố gắng.
Không dừng lại một cái nghề
Đối với tất cả các công việc khác, khi ngày làm việc kết thúc, tôi rời văn phòng trở về nhà để cố gắng và không nghĩ về công việc. Bây giờ, tôi thường không về nhà, mà đi thẳng đến những buổi meetup sau giờ làm vài lần một tuần. Vào cuối tuần tôi tham gia hackathons, các hội nghị hoặc các sự kiện.
Trở thành developer tích lũy được rất nhiều kinh nghiệm xã hội và công việc không dừng lại khi bạn rời khỏi văn phòng. Là developer có nghĩa là liên tục liên tục tìm hiểu, không ngừng học hỏi, tham gia các sự kiện, trau đổi với những developer khác, thử nghiệm, xây dựng, cố gắng, thất bại, sửa chữa và cải tiến.
Đây có thể là một thách thức lớn cho những người tham gia vào ngành công nghiệp khi lớn tuổi vì đa phần chúng tôi đã có gia đình và ít thời gian để tham dự các sự kiện. Những ngày đầu tôi gần như không thể cân bằng được giữa gia đình với công việc. Vì vậy tôi giới hạn mình chỉ tham dự 1-2 buổi họp mỗi tuần và dành thời gian cuối tuần cho chồng tôi và bạn bè
Được nói chuyện trước mọi người là niềm hạnh phúc
Tôi là người tham vọng, vì vậy việc tham gia vào lĩnh vực công nghệ là 1 thành công với tôi. Và mặc dù chưa bao giờ có kế hoạch để nói chuyện trước công chúng, tôi may mắn được trở thành một diễn giả công nghệ ở Vienna, tôi tham gia nói chuyện tại những buổi meetup và gần đây nhất là tại một cuộc hội thảo trước hơn 1000 người. Có thể nói về tuổi tác và kinh nghiệm không quan trọng bằng việc tôi được đứng trước mọi người và nói về những gì tôi thích. Tôi cũng đã bắt đầu giảng dạy những gì tôi biết cho người khác. Tôi tự hỏi rằng liệu mình có đủ tự tin để làm điều này lúc tôi 22
Vì vậy, sau tất cả, đó là một chuyến đi tuyệt vời và tôi mong muốn trải nghiệm nhiều hơn trong ngành công nghiệp này với tất cả những con người tuyệt vời và những điều tuyệt vời mà nó đã dạy tôi. Tôi liều lĩnh tham gia cuộc phiêu lưu mạo hiểm này và cho đến nay có vẻ như tôi đã quyết định đúng. Tôi thực sự biết ơn tất cả những người đã ủng hộ quyết định của mình, đặc biệt là chồng tôi.
Điều gì giữ tôi ở lại?
Hy vọng những buổi nói chuyện trước công chúng, những thách thức trong lập trình, các hội nghị lớn, những cái ôm từ những con người tuyệt vời và khả năng đạt được mục tiêu trong công việc là tổng hòa những điều giữ tôi lại với công việc này. Vì vậy, nếu bạn có ý định thay đổi công việc nhưng cảm thấy rằng mình quá già, hãy để tôi nói với bạn một điều: Bạn không bao giờ quá già để trở nên hạnh phúc và thành công, để tận hưởng công việc và để gặp những người mới qua công việc. Bạn xứng đáng được hạnh phúc và làm việc trong một lĩnh vực mà bản thân thật sự đâm mê. Chúc bạn may mắn!
Nếu mới làm quen với React, bạn hẳn đã nghe qua “Higher Order Components” và “Container” component. Và tự hỏi rằng sao mọi người có vẻ quan tâm đến bọn này cũng như cách chúng hoạt động ra sao.
Là một nhân viên bảo trì cho Apollo’s React integration – Open source library nổi tiếng với High Order Components. Tôi cũng phải mất một thời gian mới có thể hiểu rõ về chúng.
Vì thế mà hi vọng bài viết này sẽ cung cấp thông tin hữu ích cho bạn về Higher Order Components
React re-primer
Đầu tiên, trước khi đọc bài viết này, bạn cần sẽ biết chút đỉnh về React. Nếu có thời gian thì hãy vào xem bài viết của Sacha Greif’s5 React Concepts. Do tôi muốn giữ mọi thứ ngắn gọn cho dễ đọc nên sẽ chỉ tóm tắt vài điều bạn cần phải biết về React.
Một React Application bao gồm một set của components. Component là tập hợp các input properties (props) và cho ra HTML vốn được rendered lên màn hình hiển thị. Khi component’s props thay đổi thì nó sẽ re-render và HTML cũng bị thay đổi.
Khi user tương tác với HTML thông qua một event gì đó như click chuột, component sẽ xử lí quá trình trên nhờ vào callback prop để thay đổi internal state. Hành động trên cũng sẽ khiến cho các state re-render.
Điều đó còn được gọi là component lifecycle, khi component lần đầu tiên được render, và gắn vào DOM cũng như thông qua các props mới, etc.
Component’s render function giúp trả lại một hoặc nhiều component khác. Từ đó tạo ra một nhánh cây – view tree. Nói cách khác, khi tương tác diễn ra sẽ dẫn đến việc các component phản ứng theo trình tự và qui định.
React UI vs statefulness
Có lẽ giờ thì cách này đã trở nên lỗi thời nhưng hồi trước, mọi thứ đều được phân biệt một cách rõ ràng vào 3 nhóm Models, Views và Controllers. Nhiệm vụ của một View là render và xử lý tương tác của người dùng trong khi Controller sẽ chuẩn bị Data cần thiết.
Tuy nhiên, nhiều developer bắt đầu dùng tới functional stateless components trên React. Chúng là các “pure” component chỉ thực hiện việc chuyển đổi props thành HTML và callback props dựa trên các tương tác của user đưa ra
Nói cách khác bạn có thể xem chúng là functional, như vậy view tree cũng được xem là một function khổng lồ dành riêng cho việc chuyển đổi Props thành HTML.
Một lợi thế nổi bật của functional stateless component là vì chúng rất dễ để test và đơn giản. Nói cách khác, nó dễ phát triển và check phát hiện bug nhanh chóng.
Thế nhưng không có nghĩa bạn sẽ luôn dùng tới chúng. Bởi UI cần có state, và như vậy bạn sẽ phải dùng tới class-based components. Vấn đề sẽ bắt đầu trở nên phức tạp hơn khi “global state” của UI dính dáng vào view tree.
Global State
Global state của UI là state không trực tiếp liên kết với chỉ duy nhất một component. Nó thông thường bao gồm 2 phần:
Phần data trong ứng dụng của bạn vốn đến từ server. Thông thường các thông tin này được sử dụng cho nhiều vị trí khác nhau chỉ không phải cho một component duy nhất.
Global UI state – ta thường gắn nó với component ở vị trí cao nhất trong app của bạn và cho phép các component cấp thấp sử dụng nó nếu cần. Và những thay đổi sẽ được đưa ngược lại lên state, quá trình này con được gọi callback.
Phương thức này lại không được tốt bởi do nó sẽ chở nên chậm chạp nhanh chóng. Đó là bởi vì component gốc cần biết và hiểu hết tất cả yêu cầu đưa ra của toàn bộ các thành viên trong view tree.
Containers và Presentational Components
Vấn đề trên thường sẽ được giải quyết bằng cho phép component truy cập global state từ bất cứ đâu trong view tree.
Nói cách khác, ta sẽ chia component thành nhóm được phép kết nối với global state và nhóm không.
Các “pure” components thuộc nhóm không sẽ dễ hiểu và test hơn (đặc biệt nếu chúng là functional stateless component). Nói cách khác khi chúng trở thành “impure” – làm nhiều chức năng khác thì sẽ khó hơn cho việc phát triển và test chúng.
Vì thế mà ta sẽ chia những “impure” component đó thành 2 phần:
Container component: Chuyên làm những việc mờ ám cho global state
Presentational component: Không làm cho global state
Và giờ đây ta có thể xem các component này như “Pure” bởi ra chi cách những phần phải làm việc đen tối cho global state vào một container.
Container
Bạn sẽ thấy việc viết ra container rất là thú vị bởi dù nó thuộc component, thế nhưng lại chả giống gì bởi:
Lấy và đưa một phần của global state cho các component cần
Chạy one data-accessing query và đưa ra kết quả cho các component cấp thấp hơn
Nói khác, chỉ một phần của component mà container chỉ định sẽ được render, đồng thời các component đó cũng phải có liên kết với container.
Tổng quát hóa Container
Các container khác nhau tùy thuộc vào loại component mà chúng liên kết với và loại data mà chúng lấy từ global state. Trong Redux, một container sẽ như sau:
// This is a vastly simplified implementation of what a Redux container would do
class MyComponentContainer extends Component {
mapStateToProps(state) {
// this function is specific to this particular container
return state.foo.bar;
}
render() {
// This is how you get the current state from Redux,
// and would be identical, no mater what mapStateToProps does
const { state } = this.context.store.getState();
const props = this.mapStateToProps(state);
return <MyComponent {...this.props} {...props} />;
}
}
Tuy rằng container này sẽ có hết mọi tính năng như một Redux container thực thụ, bạn cũng có thể thấy ngoài mapStateToPropsvà MyComponent, chúng ta phải ghi nhập mã lệnh mỗi khi viết một Redux-accessing container.
Cách tạo ra Container
Bạn sẽ ngạc nhiên khi biết rằng khá dễ để viết một function chuyên generate container component dựa trên những thông tin thích hợp.
function buildReduxContainer(ChildComponentClass, mapStateToProps) {
return class Container extends Component {
render() {
const { state } = this.context.store.getState();
const props = mapStateToProps(state);
return <ChildComponentClass {...this.props} {...props} />;
}
}
}
Đó là Higher Order Component (HOC), một function chuyên lấy một component và các thông tin khác nhằm tạo ra container cho chính component đó.
Gọi là high order là bởi vì đây là function có cấp cao. Nói cách khác, bạn ó thể xem React Components như những function tạo ra UI. Không chỉ thể mà nó vẫn xài được cho functional stateless components và cả pure stateful presentational component.
Một số ví dụ cho HOC
Redux’sconnect function có lẽ được biết đến nhiều nhất, `buildReduxContainer` function trong bài viết này chính là một phiên bản dỏm dựa trên nó.
React Router’swithRouter function với tính năng lấy router từ context để biến thành thành prop cho các component.
react-apollovới interface chính là graphql HOC, khi được cung cấp component và GraphQL query sẽ đưa ra kết quả dành cho query và component đó.
Higher order component chính là trái tim của việc phân chia components theo function để giải quyết chúng. Ở các phiên bản của React trong quá khứ, ta phải dùng đến classes và mixins để reuse code, thế nhưng trong tương lai, higher order components sẽ ảnh hưởng mạnh mẽ hơn trong quá trình phát triển của React.
Nếu bạn lo lắng về sự phức tạp thì đừng lo bởi team phát triển React đã dày công nghiên cứu và cải thiện giúp cho chúng trở nên đơn giản hơn ngay cả cho cả người mới.
“Một làn sóng mới đang đến. Con người sẽ bị đánh cắp hết việc làm. Tuy nhiên, những người bắt kịp với làn sóng này sẽ trở nên giàu có và thành công hơn”.
Jack Ma – nhà sáng lập tập đoàn thương mại điện tử hàng đầu thế giới Alibaba, đã nhìn thấy trước sự thay đổi lớn trong kỷ nguyên công nghệ toàn cầu. Trả lời phỏng vấn trên CNBC, vị tỷ phú này cho rằng trong 30 năm tới, trí thông minh nhân tạo (AI) sẽ vượt qua kiến thức của con người dẫn đến hệ quả là chúng ta sẽ dần mất hết việc làm vào tay robot.
“Một làn sóng mới đang đến. Con người sẽ bị đánh cắp hết việc làm. Tuy nhiên, những người bắt kịp với làn sóng này sẽ trở nên giàu có và thành công hơn”, Ma nói.
Ngược lại, đối với những người tụt hậu phía sau, chắc chắn tương lai sẽ rất “thảm khốc”.
Theo vị tỷ phú này, trung tâm của kỷ nguyên công nghệ đang phát triển như vũ bão chính là dữ liệu (data). Do đó, ông dự đoán trong tương lai, thị trường việc làm sẽ ưu tiên những kỹ năng liên quan đến dữ liệu và việc phân tích dữ liệu.
“Thế giới đang chuyển dần sang data hóa. Tôi nghĩ chúng ta đang sống trong giai đoạn khởi đầu của thời đại bùng nổ dữ liệu”, Jack Ma cho biết.
Là một trong những tập đoàn công nghệ hàng đầu thế giới, Alibaba nắm giữ khối lượng dữ liệu khách hàng khổng lồ. Rất nhiều người trong số đó ghé thăm website của Alibaba hàng trăm lần mỗi ngày. Chính điều này đã cho Jack Ma thấy bước chuyển biến trong một thập kỷ tiếp theo của thế giới.
“Chúng tôi nghĩ rằng dữ liệu sẽ trở thành một phần quan trọng trong cuộc sống của con người trong tương lai. Ngày mai, với sự trợ giúp của Internet, tất cả mọi thứ đều có thể kết nối với nhau”, người đứng đầu Alibaba chia sẻ.
Trên thực tế, Jack Ma không phải là nhà lãnh đạo duy nhất nhấn mạnh tầm quan trọng của kỹ năng phân tích dữ liệu. Elon Musk – CEO của Telsa và SpaceX cũng đang thực hiện một dự án liên kết não người với máy tính nhằm cải tiến tốc độ xử lý dữ liệu vốn đang “chậm chạp đến khó tin” của não người.
Nhà đồng sáng lập Microsoft Bill Gates cũng nói rằng khả năng khai thác thông tin sẽ giúp chuyển đổi vấn đề sức khỏe toàn cầu và ngăn chặn sự phát triển của nhiều dịch bệnh.
Chủ tịch Eric Schmidt
Eric Schmidt – Chủ tịch Tập đoàn Alphabet (công ty mẹ của Google) và Jonathan Rosenberg – Cố vấn cấp cao cho CEO Larry Page đều đồng ý rằng phân tích dữ liệu là kỹ năng hàng đầu mà mọi sinh viên trẻ đều nên học.
“Phân tích dữ liệu, ý tôi là những kiến thức cơ bản về cách thức hoạt động của dữ liệu thống kê, hay cách mà mọi người đưa ra kết luận sau khi phân tích khối lượng dữ liệu lớn”, Schmidt nói.
“Tôi cho rằng kiến thức cơ bản về phân tích dữ liệu là cực kỳ quan trọng với thế hệ những người trẻ tiếp theo. Bởi đó chính là thế giới mà các bạn sắp bước vào”, Chủ tịch Alphabet nhấn mạnh.
Bạn chỉ có 24 chỗ cho app icon trên màn hình iPhone, hoặc 28 nếu là iPhone 7 nên việc tạo ra app icon hoàn hảo là một bước quan trọng để thu hút sự quan tâm của người dùng.
Tôi đã từng gặp 1 user để màn hình chính là các app icon gồm tất cả chữ cái trong bảng chữ cái, nhưng không phải ai cũng vậy. Đối với đa số người tải ứng dụng, app icon là nơi tiếp xúc đầu tiên giữa người dùng với ứng dụng mới.
Nếu app icon xấu, người dùng sẽ xóa ứng dụng hoặc ẩn ứng dụng trong một thư mục ở nơi nào đó mà họ dễ dàng quên đi. Vậy có thể làm gì để đảm bảo rằng app icon của mình là “nữ hoàng của cuộc chơi” chứ không không phải là “cô gái nhút nhát”?
Rất nhiều bài báo khoa học đã nghiên cứu ý nghĩa đằng sau việc chọn màu cho app icon của bạn. Thậm chí đã có người tạo ra biểu đồ các màu phổ biến nhất dùng cho app icon.
Biểu đồ này hàm chứa 2 ý nghĩa: sử dụng chủ yếu các màu như đỏ, xanh hoặc có thể là màu xanh lá cây cho app icon như 1 giải pháp khá an toàn. Mặt khác, bạn có thể chọn màu hồng, tím hoặc màu vàng để nổi bật hơn một chút.
Đương nhiên, mỗi lựa chọn đều có những ưu và nhược điểm riêng. Những gì an toàn và quen thuộc thì dễ bị quên lãng, trong khi việc phá vỡ khuôn khổ tiềm ẩn nguy cơ quá khác biệt và không hài hòa với những ứng dụng khác.
Sử dụng 1 kí tự (hoặc Không …)
Từ kí tự ‘F’ của Facebook và ‘H’ của Hotels.com chữ “D” trong Dailymotion và ‘S’ của Skype, không ít các app sử dụng chữ cái đầu tiên trong tên công ty cho ứng dụng của mình,
Đây chắc chắn là một giải pháp thông minh và đơn giản nhưng không phải là không có rủi ro nếu tên ứng dụng của bạn bắt đầu bằng một kí tự rất phổ biến.
Hãy suy nghĩ về các app trên thị trường, đặc biệt nếu bạn đang cạnh tranh trực tiếp với những ứng dụng đó. Hãy lựa chọn một hướng đi khác nếu không muốn bị nhầm lẫn hoặc thậm chí là đồng nhất với họ.
Có lẽ, sự gắn kết quá lâu của Skype với chữ ‘S’ trong hình ảnh đám mây, đã khiến Skyscanner đưa ra biểu tượng trừu tượng nhỏ gọn cho app icon của họ.
Sử dụng chữ cái là một sự lựa chọn rất an toàn, đặc biệt nếu logo ứng dụng có một phông chữ đặc biệt được liên quan đến nó.
Lấy ví dụ như kí tự “F” của Facebook trở nên đặc biệt dễ nhận biết nhờ vào sự kết hợp giữa logo công ty với phiên bản sửa đổi của phông chữ Klavika Bold.
Nhưng dường như ngay cả Facebook cũng không thể quyết định xem chữ cái hay biểu tượng thì phù hợp nhất với app icon mà Facebook đang xây dựng. Tại sao người ta lại đưa tia chớp của Harry Potter trở thành icon Messenger thay vì sử dụng chữ ‘m’ trong đoạn thoại bong bóng?
Sử dụng sơ đồ phối màu tương tự
Điều tồi tệ hơn cả app icon xấu, đó là một biểu tượng ứng dụng đẹp nhưng chứa đựng nội dung không hấp dẫn và lỗi thời. Ấn tượng đầu tiên rất quan trọng, nhưng nếu bạn không thể đáp ứng được yêu cầu khách hàng đặt ra bạn sẽ thất bại.
Dưới đây là tip chỉ dẫn từ Dan Counsell – người đã đưa ra các ví dụ về cách Ember và Clear giữ sự nhất quán từ khi mở ứng dụng tới lúc người dùng thực sự sử dụng nó:
Mặc dù vậy, điều này không có nghĩa rằng tất cả mọi thứ phải được thực hiện chính xác như nhau.
Chẳng hạn, Take Words With Friends đã bổ sung thêm một trái tim và cỏ ba lá vào biểu tượng ứng dụng cho Ngày Valentine và Ngày của Thánh Patrick. Đây chắc chắn là giải pháp rất phù hợp, miễn là người dùng cập nhật ứng dụng thường xuyên, kịp thời.
Và đây là kết quả:
Phản ánh mục đích của ứng dụng
Bạn có nhớ khi Instagram thay đổi biểu tượng? Nhiều người không biết rằng Instagram đã có app icon trước khi thay đổi thành một cái máy ảnh màu nâu với dải cầu vồng mà mọi người đều biết và yêu thích.
Lý do đưa ra cho việc thay đổi logo đầu tiên: “Biểu tượng cũ không liên quan gì đến Instagram”. Với ý nghĩ đó, thật là dễ hiểu tại sao Instagram lại quyết định thay đổi bộ logo thành:
Biểu tượng máy ảnh nâu cổ điển gợi nhớ những bức hình được chụp bởi chiếc máy ảnh Polaroid, và không có liên quan gì đến tương lai của ngành nhiếp ảnh. Và với 80 triệu ảnh được chia sẻ mỗi ngày trên Instagram, đó là chính xác là những gì Instagram đã làm được – cho dù bạn thích hay không
Kết luận
Thật đáng thất vọng, nhưng như đã dự đoán, không có lựa chọn nào được đánh giá là tốt nhất để tạo ra một app icon hoàn hảo cả.
Những lời khuyên trên tuy rất hữu ích, nhưng lại không hề đơn giản, như việc bạn cài đặt đồng hồ – ví dụ, 1 ứng dụng dành cho trẻ em hoặc thanh thiếu niên trông rất khác với ứng dụng dành cho doanh nhân hoặc người về hưu
Hầu hết các Founders, app creators… xây dựng sản phẩm hoặc ứng dụng để giải quyết một vấn đề gặp phải trong cuộc sống. Nói cách khác, bạn có thể trở thành đại diện tốt cho chính thị trường mục tiêu của bạn. Hãy suy nghĩ về các app icon mà bạn cảm thấy bị thu hút, hoặc ít nhất bạn cũng phải có tấm lý sẵn sàng để app icon trên màn hình chính của mình. Đó chính là cách xây dựng app icon thành công.
Và, thậm chí nếu bạn kết thúc với một app icon thực sự đáng thất vọng thì ít ra nó cũng có thể “nổi tiếng” trên Reddit.
Đó là vào một bữa sáng bình thường như mọi người tại San Francisco, Louis cảm thấy thật tự tin khi bước vào quán ăn ưa thích của mình để mua một cốc cafe. Anh dạo bước đi đến công ty của mình, ánh mặt trời rạng rỡ như đang chào đón anh. Tất cả bắt đầu từ căn hộ nhỏ bé của Louis, nơi anh và đồng nghiệp bỏ ra tới 3 tháng code để tạo ra Saas, và giúp cho công ty có nguồn thu nhập khủng lên tới $10M hàng năm.
Chỉ vài ngày sau đó (diễn ra vào tháng 2, 2016), giá cổ phiếu của SaaS giảm tới hơn 30%. Khiến cho một số công ty công nghệ như Tableau bị giảm giá trị tới hơn một nửa. Một phần nguyên nhân là do Linkedin liên kết với Microsoft. Buổi sáng thứ hai tiếp theo không còn ấm áp nữa, Louis phải che người với chiếc áo khoác của anh khi cơn gió lạnh như băng cứa vào người anh. Đó cũng là lúc Cloud 3.0 được tung ra.
SaaS đang dần chết đi
Cloud vốn luôn thân thiện đối với các doanh nhân, đặc biệt là sau khi Salesforce được khai sinh. Một môi trường vô cùng màu mỡ cho các công ty bởi dịch vụ tốt, set up dễ dàng, quản lí lại cực đơn giản. Sản phẩm làm ra được cải thiện nhanh chóng và làm hài lòng khách hàng.
Tuy nhiên như Gil Dibner đã nói – sự thành công của SaaS lại chính là nguyên nhân dẫn đến sự tàn lụi của chính nó:
Bởi tính sẵn có và áp dụng hàng loạt từ cloud-based (SaaS) technology khiến cho việc tạo ra các software system cao cấp trở nên quá dễ dàng, nhanh chóng và rẻ đến mức khiến cho giá trị của chúng bị mất đi. Chính do việc software tràn lan đã khiến cho giá trị thu được từ software biến mất. Nói cách khác, khả năng viết và deploy code không còn là một giá trị cốt lõi nữa.
Trong thời đại của cloud và open source, việc kiếm tiền từ bán các sản phẩm software cao cấp có sử dụng cloud làm kênh phân phối trở nên khó khăn hơn bởi sự hiện diện của open source. Các công ty chỉ biết tập trung vào phát triển sản phẩm mà không quan tâm đến vấn đề của người dùng sẽ rất khó mà thành công được.
Chính Louis và các doanh nhân khác đã không thấy được 2 vấn đề rất lớn đối với cách kinh doanh mới của họ: Chi phí cho Stacking và Switching
Stacking
Các đế chế phần mềm trong quá khứ như Oracle, SAP, etc – có con đường phát triển rất dễ dàng: turn-key M&A. Họ mua những công ty phần mềm đang lên, cắt bớt quỹ tiền cho việc phát triển sản phẩm và sử dụng đội ngũ sale của mình để đẩy mạnh việc phân phối. Thế là chỉ trong một đêm, công ty với giá trị $10M sẽ tăng chóng mặt lên $50M hoặc $100M.
Thế nhưng giờ đây, với SaaS,software vẫn luôn được cải thiện, phát triển và quản lí bởi product và engineering teams. Giá trị của hợp đồng (tính theo tháng) sẽ bị giảm so với chi phí tìm kiếm khách hàng. Như vậy để có lời thì phải đầu tư rất nhiều, và chỉ có khách hàng lâu năm, hài lòng với sản phẩm mới sẵn sàng bỏ tiền ra mua.
Như vậy với SaaS, team phải nhỏ để tiền lãi được nhiều hoặc qui mô đủ lớn để có thể tạo ra tiền lời. Mọi thứ còn lại sẽ chỉ khiến cho bạn bị lỗ vốn.
Như vậy việc Stacking doanh thu không còn đơn giản như xưa nữa.
Switching
Các công ty SaaS sẽ luôn có khách hàng mới tìm đến, họ đều rất dễ tính, không phải tốn công sức để mồi chài thu hút. Tuy nhiên điều đó cũng đúng với các đối thủ của SaaS. Không những thế, nhiều công ty còn muốn việc khách hàng thay đổi lựa chọn dễ dàng hơn để họ có thể thu hút được nhiều người dùng tìm năng. Tuy nhiên điều đó càng khiến user thiếu đi sự trung thành đối với sản phẩm.
Peter cảm thấy vô cùng chán nản bởi các khách hàng không hề muốn sử dụng software của công ty bởi nó quá rắc rối và tốn công khi phải thay đổi một software. Do đó, Peter và team của mình đã tạo ra một phần mềm làm cầu nối để giúp cho việc switch sử dụng SaaS. Và khi developer được chạm vào nó, việc kết nối trao đổi ngay lập tức đạt tới một level hoàn toàn mới.
Sự thành công của SaaS lại chính là thứ đã giết chết nó bởi thời gian và chi phí bỏ ra để phát triển một software đã bị giảm đi rất nhiều. Khiến cho nhiều công ty như bị lạc vào vùng đất cằn cỗi, không đủ lớn để có thấy tạo ra lợi nhuận, cũng không có khả năng phát triển bởi quá nhiều đối thủ đến từ đủ các nhóm như cao cấp, trung cấp và bình dân.
Khi Google tung ra tool trợ giúp tạo ra ứng dụng, giúp cho việc thay thế và phát triển ứng dụng không còn là điều lạ lẫm nữa, chúng ta đều biết nó sẽ khiến bộ mặt của IT thay đổi hoàn toàn.
Bước vào thời đại của Cloud 3.0
Phiên bản tiếp theo của Cloud software sẽ châm ngòi nổ cho các nhà cung cấp đưa ra các offer mới. Tuy nhiên nó sẽ không còn giống như cũ – mà thay vào đó là các team phát triển nhỏ kèm theo các software đi kèm với nhiều dịch vụ kỹ lưỡng.
Sự khác biệt của các công ty dùng Cloud 3.0:
Kết nối từ mọi nơi: Chỉ với một click, bạn đã có thể kết nối với tất cả các platforms với những nguồn dữ liệu liên quan cũng như các tool vô cùng mạnh mẽ.
Open platform: APIs được phát triển hoàn thiện với đa dạng các function, kèm theo khả năng lưu trữ core data.
Programmatic: Không còn lo lắng về interfaces, dashboards hoặc logins
III: Solution Ecosystem – Cung cấp giải pháp cho các developer
Có lẽ sẽ không có gì đáng ngạc nhiên khi Salesforce — công ty sáng lập ra “The Cloud”, sẽ trở thành kiểu mẫu cho các công ty thế hệ tiếp theo bởi:
Nó là một lược đồ chuẩn cho CRM data
Dễ dàng tích hợp với hàng trăm giải pháp
Mối quan hệ với hàng nghìn nhà thầu chuyên gia trong phát triển software.
Tin rằng sự tiến hóa của ngành IT sẽ càng mạnh mẽ hơn khi mối quan hệ giữa các developer và nhà đầu tư ngày càng khăn khít hơn. Hãy tưởng tượng xem, hàng triệu công ty được trợ giúp bởi các nhà thầu và chuyên gia hàng đầu về giải pháp.
Các khách hàng của Louis bắt đầu muốn từ bỏ sản phẩm của công ty bởi mức giá không còn phù hợp. Đây cũng đánh dấu thời đại lụi tàn của SaaS khi số lượng các công ty phát triển ngày càng ít đi. Giờ đã xa rồi cái thời đại bỏ tiền đầu tư một cách mù quáng mà thay đó là sự phát triển giữa mối quan hệ các công ty và nhà đầu tư.
Vì thế các CEO hãy luôn tự hỏi bản thân về sản phẩm của mình. Nó đặc biệt ở điểm nào? Liệu có thích hợp với thị trường không? Làm cách nào để ngăn chặn việc copy sản phẩm của mình và bị bán ra với giá chỉ bằng 1/10 của thị trường? Có thể bạn và Louis cũng đang trăn trở câu hỏi tương tự…..