Thị trường IT Việt Nam ngày càng phát triển và trở nên năng động hơn. Đó là một phần lý do để thu hút một lượng lớn doanh nghiệp công nghệ nước ngoài đầu tư vào Việt Nam, tiêu biểu trong số đó là các công ty của Hàn Quốc.
Bên cạnh đó, qua “cái bắt tay” chiến lược giữa Korea IT Cooperation Center tại TP. HCM (KICC HCMC) và Nền tảng tuyển dụng chuyên về IT hàng đầu Việt Nam – TopDev, các lập trình viên Việt càng có nhiều lựa chọn hơn khi tìm kiếm nơi làm việc phù hợp, đặc biệt nhất chính là cơ hội trải nghiệm môi trường làm việc “chuẩn” quốc tế cùng nhiều công nghệ tiên tiến đến từ Hàn Quốc.
Ra đời vào năm 1998, Total Soft Bank Ltd (TSB) là công ty chuyên cung cấp các giải pháp maritime logistics thông qua việc áp dụng công nghệ tiên tiến hàng đầu cùng đội ngũ phát triển giàu kinh nghiệm chuyên môn. Một số giải pháp tiêu biểu của công ty như: tự động hóa tàu biển, các giải pháp cảng,…
⇒ Bạn vừa ra trường và muốn trải nghiệm làm việc tại công ty thuộc lĩnh vực logistics thì Total Soft Bank Vietnam chính là “đáp án” dành cho bạn!
⇒ Hãy sẵn sàng “bùng nổ” năng lực, cùng chinh phục những thử thách giúp nâng cao tay nghề từ Total Soft Bank Vietnam với vị trí Fresher Software Developer
Được thành lập từ năm 2009, LOTTE Data Communication Việt Nam đóng vai trò cung cấp hầu hết các giải pháp và Dịch vụ IT cho các công ty con thuộc Tập đoàn LOTTE đang kinh doanh tại Việt Nam. Kế thừa tất cả tinh hoa từ Công ty mẹ, LOTTE Data Communication Việt Nam kết nối và phát triển mạng lưới khách hàng thuộc mọi lĩnh vực từ Bán lẻ, Sản xuất đến Tài chính, Dịch vụ Công… bằng những giải pháp bắt kịp xu hướng Công nghệ của thế giới như Triển khai hệ thống ra vào cho cao ốc, An Ninh nhận diện khuôn mặt, Smart Parking, Thu phí tự động,…
LOTTE Data Communication Việt Nam đem đến nhiều cơ hội phát triển sự nghiệp cho các Lập trình viên tài năng. Cùng khám phá những vị trí hấp dẫn mà bạn không nên bỏ lỡ:
Hanbisoft là công ty chuyên cung cấp các dịch vụ máy tính tùy chỉnh cho doanh nghiệp, giúp các hoạt động quản lý: nhân sự, kế toán, thuế, vận chuyển hàng hóa, mua bán,…trở nên dễ dàng hơn.
Tự hào với môi trường làm việc chuyên nghiệp, Hanbisoft sẽ là nơi các lập trình viên có thể bùng nổ năng lực qua các dự án phát triển ứng dụng di động và phần mềm chất lượng.
⇒ Bạn muốn tìm kiếm môi trường làm việc ổn định, lâu dài cùng cơ hội học hỏi các công nghệ mới nhất? Hãy thử khám phá vị trí React Native Developer tại Hanbisoft, biết đâu đây chính là “bến đỗ” phù hợp với tài năng của bạn!
Được thành lập từ năm 2016, VNIB Tech là công ty chuyên cung cấp các phần mềm trên nền tảng di động (iOS, Android) và web. Hoạt động với sứ mệnh mang thế giới đến gần nhau hơn bằng công nghệ, VNIB Tech không ngừng cải tiến chất lượng, đem đến cho khách hàng những sản phẩm và giải pháp tối ưu nhất. Đây cũng chính là cơ hội cho các tài năng công nghệ trải nghiệm môi trường làm việc chuyên nghiệp tại công ty đến từ Hàn Quốc và gặt hái thành công.
Bạn đã sẵn sàng chinh chiến cùng VNIB Tech trong những dự án đầy thách thức? Khám phá ngay loạt vị trí hứa hẹn cho bạn cơ hội bứt phá sự nghiệp:
Mintpot Việt Nam là thành viên của Minpot, có trụ sở chính tại Hàn Quốc, và là một trong những công ty sáng tạo thông minh, chuyên cung cấp các dịch vụ video VR có phụ đề Mint VR với ước mơ tạo ra một cuộc sống tốt hơn với VR.
Đến với Mintpot, ngoài mức lương cực hấp dẫn, bạn còn có nhiều cơ hội thăng tiến và phát triển không giới hạn. Nếu bạn đang tìm kiếm “bến đỗ” cho sự nghiệp và đã sẵn sàng tạo cú hích mới cho bản thân? Vậy Mintpot chính là câu trả lời tốt nhất cho bạn..
Đừng bỏ lỡ cơ hội! Gia nhập Mintpot ngay với 1 trong 3 vị trí hấp dẫn đang chờ bạn trực tiếp trải nghiệm:
Genuwin là công ty thuộc top đầu trong ngành lập trình phần mềm quản lý nhân sự, kế toán, quản lý sản xuất, nhà hàng khách sạn, sân golf, trường học quốc tế, liên kết thanh toán với hệ thống ngân hàng Hàn Quốc Shinhan Bank với mạng lưới khách hàng trải dài khắp Việt Nam và các nước như Campuchia, Indonesia, Hàn Quốc…
Với đội ngũ nhân viên chuyên nghiệp, tận tâm và có năng lực, trách nhiệm cao, Genuwin ngày càng phát triển và từng bước trở thành một trong những nhà cung cấp và phát triển hệ thống quản lý (ERP) hàng đầu.
Và nếu bạn là ERP Developer đang tìm kiếm cơ hội phát triển sự nghiệp qua các dự án phát triển hệ thống ERP, đừng ngần ngại click apply để gia nhập Genuwin Solution ngay hôm nay.
Đường đua công nghệ tại Việt Nam đang nóng hơn bao giờ hết! Với sự xuất hiện của Top 6 công ty công nghệ Hàn Quốc, hy vọng bạn sẽ lựa chọn được “bến đỗ” phù hợp và sẵn sàng cháy hết mình với đam mê lập trình!
⇒ Và đừng quên, KICC HCMC X TopDev sẽ còn mang đến cho cộng đồng IT Việt Nam nhiều cơ hội mới. Hãy chờ đón những bài viết tiếp theo cùng những cơ hội mới hấp dẫn bạn nhé!
________________________________
Dự án được hỗ trợ bởi Korea IT Cooperation Center tại TP. HCM (KICC HCMC) – thuộc Cơ quan Xúc tiến CNTT Hàn Quốc (NIPA), phối hợp cùng TopDev – Nền tảng tuyển dụng CNTT hàng đầu tại Việt Nam với mục đích thúc đẩy tuyển dụng việc làm CNTT cũng như quảng bá cho các công ty IT Hàn Quốc trong cộng đồng lập trình viên lớn nhất tại Việt Nam.
Liên hệ: Korea IT Cooperation Center tại TP. HCM (KICC HCMC)
Senior Developer là gì? Có gì khác so với Junior Senior hay Fresher? Tuyển dụng IT đã có những tên gọi riêng nhằm phân loại các vị trí khác nhau. Senior Developer là một trong số đó. Tuy nhiên, bạn đã có cách hiểu chính xác về thuật ngữ này chưa? Cùng TopDev tìm hiểu tất tần tật về Senior Developer qua bài viết sau!
Senior Developer là gì?
Nhiều định nghĩa đã được đưa ra về cách hiểu Senior Developer? Vậy Senior Developer thật sự là gì? Trước hết hãy cùng tìm hiểu sơ lược về thế nào là Senior?
Bạn biết gì về thuật ngữ Senior?
Senior là gì? Senior được biết đến là một thuật ngữ mô tả các cá nhân sở hữu nhiều kinh nghiệm (cả về kỹ năng chuyên môn và trải nghiệm thực tế). Theo quá trình, năng lực của họ được nâng cao hơn từ nền tảng cơ sở thông qua các giai đoạn tiền phát triển trước đó như Intern, Fresher, Junior,…
Senior Developer là gì?
Senior chỉ những người có thâm niên trong nghề lâu hơn. Do vậy, không quá để gọi họ là những tiền bối hoặc cấp cao. Thời gian “thăng tiến” của một Junior lên Senior đòi hỏi sự tập trung vào sự nghiệp phát triển của mỗi cá nhân.
Không có một thước đo cụ thể về thời gian. Vì nó chỉ mang tính tương đối. Đặc biệt, tùy thuộc vào từng quy mô – loại hình doanh nghiệp, việc phân loại và đánh giá một Senior sẽ dựa trên nhiều yếu tố khác nhau.
Senior Developer là gì?
Senior Developer là thuật ngữ được quy chiều đến đối tượng là các lập trình viên cấp cao. Một thực tế là họ dễ dàng nắm bắt và làm tốt mọi thứ trong bất kỳ một giai đoạn nào của công việc ngành IT. Nắm rõ quy trình thực hiện, các khâu có liên quan; tất tần tật đều được họ điều phối và vận hành một cách trơn tru, chuyên nghiệp nhất. Đặc biệt hơn, họ lại có khả năng kết nối, trao đổi để tìm ra các mong muốn của khách hàng.
Điểm nổi trội của Senior nằm ở nền tảng tư duy, năng lực nhận biết về quá trình thực hiện, giải quyết các nhiệm vụ. Đồng thời, họ vẫn song song tự hoàn thiện và phát triển mình lên một mức cao hơn (có thể là Senior Manager). Chính điều này kích thích họ luôn thử sức, rèn luyện bản thân để có những trải nghiệm phong phú hơn.
Một Senior “cừ khôi” sẽ phát huy tốt óc sáng tạo, năng lực thích ứng, các kỹ năng của mình một cách thuần thục. Các lập trình viên cấp cao phải có khả năng quản lý các project, lập kế hoạch, đặt ra định hướng; dẫn dắt, hướng dẫn, hỗ trợ team để đạt được các mục tiêu đề ra.
Tố chất để trở thành một Senior Developer
Không ngại thất bại!
Một Senior Developer chắc chắn sẽ phải trải qua nhiểu áp lực. Biết đâu những thời gian đầu, bạn đã gặp lại các thất bại. CV cho sinh viên IT mới ra trường (CV IT student) hoặc CV IT Developer của bạn không tạo được ấn tượng với nhà tuyển dụng. Hoặc khi đi làm, bạn chịu sự áp lực từ sếp, từ đồng nghiệp,…Đôi khi nó nhiều đến mức khiến bạn bị stress.
Senior Developer có những tố chất đặc biệt.
Áp lực từ nhiều phía và rất nhiều sự mâu thuẫn sẽ nảy sinh. Đó cũng chính là lúc bạn rơi vào trạng thái phức tạp. Ai cũng thích sự đơn giản. Nếu đã là một Senior Developer, bạn phải sống trong áp lực tổn tại của ngành lập trình.
Đừng đánh giá thấp bất cứ ai!
Đây có lẽ nghiêng về phần giá trị của nhân cách nhiều hơn. Thế nhưng, bạn phải hiểu Senior Developer chỉ là một thuật ngữ mô tả các cá nhân với bề dày kinh nghiệm. Tuy vậy, ứng với từng vị trí được phân chia cụ thể, thì mỗi Senior Developer là một mảnh ghép trong doanh nghiệp.
Đừng bao giờ đánh giá thấp bất kỳ ai vì mỗi người đều có điểm mạnh – điểm yếu riêng. Dù bạn có là một người hoàn hảo những chắc chắn, bạn vẫn có những nỗi sợ của riêng mình. Thay vào đó, hãy học hỏi lẫn nhau để nâng cao trình độ, kỹ năng; kết nối các khía cạnh chuyên sâu để phát triển một cách toàn diện hơn.
Điểm nhấn từ sự kết nối
Xây dựng phần mềm cần có sự kết nối giữa trình độ (tức vận dụng lý thuyết khoa học chuyên ngành, trải nghiệm thực tiễn) và nhu cầu, mong muốn của khách hàng. Bên cạnh đó, sự kết nối này sẽ trở nên chặt chẽ hơn nhờ vào sự ảm hiểu các công cụ; tinh thần đồng đội, sự quản lý vận hành của tổ chức. Do đó, mỗi Senior Developer cần tìm ra sự kết nối trong mọi quy trình làm việc. Có thể mỗi sản phẩm, mỗi dự án, mội thành quả sẽ mang lại những giá trị tương xứng.
Tố chất của người lãnh đạo
Đây được xem là tố chất quan trọng. Vì nó không những giúp hình thành nên một Senior Developer giỏi mà còn quyết định đến sự phát triển nghề nghiệp.
Một Senior Developer phát triển độc lập, họ có thể làm bất cứ điều gì. Thế nhưng, để phát triển họ cần cộng tác với team. Bản thân họ tự hiểu rằng để thực hiện các nhiệm vụ lớn, họ cần một team luôn hổ trợ nhau. Một Senior Developer cần có trách nhiệm dẫn dắt đồng đội; luôn phấn đấu để cải thiện trình độ – kỹ năng của chính bản thân mình. Họ sẽ biết cách tạo điều kiện để bản thân và team của mình có thể phát triển tốt nhất.
Đặc biệt hơn, Senior Developer sẽ hiểu rằng bản thân họ không tạo ra quyền lực để buộc người khác làm việc. Họ cần sở hữu tố chất lãnh đạo để trao quyền cho mọi người. Họ phải là một đàn anh, một người dẫn dắt, một người truyền đạt kinh nghiệm để giúp mỗi cá nhân trong team đều có thể phát triển.
Nếu một team có một Senior Developer với vai trò lãnh đạo tốt, team sẽ thành công. Điều này giúp team dễ dàng đạt được những kế hoạch; cùng nhau nâng cao chuyên môn nghề nghiệp. Và biết đâu, mỗi cá nhân Developer đều có những định hướng cụ thể hơn trong sự nghiệp lập trình IT của mình.
Một Senior Developer sẽ làm những gì?
Những công việc chính
+ Connect với khách hàng; lắng nghe cá feedback, các phát sinh từ vấn đề từ khách hàng
+ Phân tích, đánh giá và thảo luận với team để cùng tìm ra các giải pháp/cách thức phù hợp. Đồng thời, quy định mức thời gian dự kiến hoàn thành. Chủ động liên hệ khách hàng, đảm bảo sự kết nối và thông tin về sự cam kết giải quyết nhiệm vụ.
+ Phân chia nhỏ các công việc; hướng dẫn các thành viên còn “non” trong tay nghề. Hỗ trợ họ, giúp họ bắt nhịp chung với các cá nhân khác để đạt hiệu suất cao nhất.
+ Duyệt code và thực hiện chạy thử các phương án test. Theo dõi và đánh giá tiềm nang mỗi giải pháp.
+ Fix lại các chỗ bị lỗi và chưa hoàn thiện. Senior Developer cần đảm bảo chu trình chạy thử chương trình ổn định, không phát sinh lỗi và đạt những yêu cầu như mong muốn.
Có thể nói, Senior Developer là một người dẫn đầu với năng lực toàn diện được thể hiện ở tất cả các khía cạnh. Mọi quy trình đều được họ nắm bắt, điều tiết và quản lý một cách tốt nhất. Họ có sự cầu tiến, do vậy họ thật sự tỉ mỉ và chỉn chu trong việc tổ chức thực hiện các giai đoạn công việc.
Đối với Senior Developer, họ không quá khó để khai thác và kết nối chính xác với nhu cầu của khách hàng. Dựa trên những trải nghiệm, họ biết đâu là những cách thức phù hợp để tìm ra sự phụ ứng với mong muốn từ các khách hàng khó tính nhất.
Lộ trình thăng tiến của một Senior Developer có gì thú vị?
Một điều đáng lưu tâm
Mỗi người sẽ có một thời điểm phù hợp để phát triển sự nghiệp của mình. Đỉnh cao sự nghiệp là do mỗi cá nhân tự thỏa mãn. Và việc so sánh hoặc áp đặt lộ trình thăng tiến là điều hạn chế. Vì đơn giản mọi thứ đều có tính chất tương đối.
Do vậy, sự hướng dẫn dưới đây không thể phù hợp với tất cả dân lập trình. Với một số người, vai trò quản lý có thể tốt hơn. Hoặc đơn giản bạn chỉ dừng lại ở việc thích viết code.
Đồng thời, các yếu tố khác có thể chi phối nhiều hơn. Điều này quyết định sự thành công của bạn. Hãy hiểu bản thân trước tiên, bạn thật sự mong muốn điều gì? Từ đó lập kế hoạch phát triển lộ trình thăng tiến cho riêng mình.
Fresher
Fresher chỉ những sinh viên mới ra trường. Sự va chạm chưa nhiều và có thể nói, họ đều là những “lính mới” của giới lập trình viên. Lợi thế của họ là sự chuẩn bị gần như là kỹ lưỡng về hành trang do quá trình dài rèn luyện tại giảng đường.
Nếu bạn đang apply vị trí Mobile App Developer tại một doanh nghiệp thì chiếc CV IT Developer chuẩn có thể giúp các newbie nâng cao khả năng ghi điểm của mình. Tuy nhiên, để thành công và nhanh chóng hòa nhập môi trường lập trình chuyên nghiệp, họ cần phải nỗ lực rất nhiều.
Junior Developer
Với số năm kinh nghiệm ít ỏi, cái họ nó là nền tảng trải nghiệm; những bước đi đầu trong việc tiếp cận thế giới lập trình. Họ sẽ bắt đầu đi sâu hơn vào việc phân tích lập trình ứng dụng dựa vào thực tế nhiều hơn. Hiểu biết về cơ sở dữ liệu, lưu trữ và xuất dữ liệu, nắm bắt các chức năng là những họ cần phải phát huy.
Senior Developer
Bạn có thể tự hào đôi chút khi bản thân được công nhận là một Senior Developer chính hiệu. Bạn hoàn toàn có thể xử lý các vấn đề; chịu trách nhiệm đảm nhận các dự án lớn; quản lý, áp dụng, thực hiện và giải quyết nhiệm vụ phức tạp nhất. Một điểm nhấn quan trọng của Senior Developer chính là mức độ am hiểu sâu sắc về cơ sở dữ liệu và các dịch vụ ứng dụng,…
Để đạt được level này, tất nhiên sẽ phụ thuộc vào sự cố gắng của bạn. Bạn dường như đào sâu hơn trong chính chuyên môn của mình. Bạn là người đưa ra các quyết định quan trọng về cách thức thực hiện của một hoặc nhiều dự án. Vì đơn giản, bạn hiểu rõ về cơ chế hoạt động, sự liên kết giữa các công cụ công nghệ,… Bạn dần trở thành một chuyên gia quản trị con người, quản lý một quy trình phát triển phần mềm hơn là một người đội trưởng hướng dẫn đồng đội.
Quản lý cấp trung
Hai chức danh quan trọng thường sẽ là Product Manager hoặc Project Manager. Ở giai đoạn này, bạn sẽ có vai trò lớn trong việc quy định về chuẩn chất lượng/đầu ra mà một sản phẩm nào đó thông qua nghiên cứu, phân tích.
Quản lý cấp cao
Bạn từng nghe về CTO hoặc CEO chưa? Vâng, chính xác là nó. Bạn không chỉ đơn thuần là một chuyên gia về lập trình, một người hiểu sâu rộng về công nghệ, mà bạn còn là người truyền cảm hứng; tạo động lực, vạch ra các chiến lược phát triển và dẫn dắt các leader theo một sứ mệnh, tầm nhìn nào đó. Điều này có nghĩa, bạn đang là nhân tố quyết định đến số phẫn thành hay bại của một tổ chức.
Đâu là những kỹ năng quan trọng của một Senior Developer?
Nhiều kỹ năng quan trọng có thể chi phối đến quá trình phát triển của một Senior Developer. TopDev sẽ chỉ ra một số kỹ năng ảnh hưởng trực tiếp đến sự thăng tiến của một Senior Developer.
Những kỹ năng nào quan trọng đối với một Senior Developer?
Chuyên sâu về công nghệ
Khác với Junior, Senior Developer phải là người có nhiều kinh nghiệm. Những kinh nghiệm đó được phát triển hơn thông qua quá trình dài làm việc với công nghệ/ngôn ngữ lập trình. Càng nhiều dự án với các đặc thù tính chất, môi trường làm việc khác nhau, bạn sẽ có cơ hội nâng cao năng lực của mình. Nhận ra thế mạnh về chuyên môn, đặc biệt là về khía cạnh công nghệ – kỹ thuật. Đồng thời lại biết được đâu là những hạn chế cần khắc phục.
Không chỉ có kỹ năng đánh giá năng lực bản thân, là một Senior, bạn còn phải biết cách đánh giá mức độ hiệu quả của các công cụ công nghệ. Dự án nào dùng công cụ nào để xử lý. Mọi thứ cần được diễn tiến một cách khoa học.
Kỹ năng “múa” code
Chuyên nghiệp trong việc viết code đôi khi khó thể hiện toàn diện năng lực của một Dev. Thế nhưng, nếu xét trên khía cạnh kỹ năng, Junior chỉ cần viết code cho chạy là được. Còn nếu là Senior, bạn không chỉ đơn thuần viết đúng hạn deadline, mà việc viết code phải tinh gọn, nhanh chóng. Yếu tố quyết định chính là khả năng bảo trì code. Đó cũng là điều mọi Senior Developer cần nhớ.
Tính đa nhiệm
Khi là một Senior Developer, bạn cần phải tiếp cận với các task lớn hơn. Điều đó đồng nghĩa, bạn phải am hiểu nhiều công cụ hơn. Senior Developer sẽ chia nhỏ thành từng task khác nhau. Đồng thời, phải quan tâm đến vấn đề đánh giá, phân tích mức độ khả thi, tính hiệu quả của các giải pháp. Điều này cho thấy họ phải là người hiểu rõ về cơ chế hoạt động của doanh nghiệp. Đó là cơ sở quan trọng để Senior tìm ra các mấu chốt, cách thức giải quyết phù hợp – khả thi nhất cho mọi vấn đề.
Thái độ cầu tiến
Nếu bạn đã giỏi, hãy làm cách nào đó để mình trở nên giỏi hơn. Senior Developer có thể tự học thêm vì mọi kiến thức đều có thể được cập nhật mới hơn mỗi ngày. Là một Senior, bạn cần phải hỗ trở nhiều đàn em khi họ có những vấn đề chưa giải quyết được; trực tiếp góp ý kiến, đưa ra các phán đoán trước những quyết định. Thái độ cầu thị và giúp đỡ; tính trách nhiệm với mỗi thứ mình làm đều góp phần tạo ra chân dung của một Senior Developer chuyên nghiệp.
Thu nhập của một Senior Developer như thế nào?
Mức lương phụ thuộc rất nhiều vào trình độ và số năm kinh nghiệm mà mỗi cá nhân sở hữu. Và tùy vào từng công ty, mức độ chênh lêch về lương có thể rơi vào các mức sau đây:
+ Dưới 1 năm kinh nghiệm: 5 – 10M
+ Từ 1-3 năm kinh nghiệm: 12 – 24M
+ Từ 3- 5 kinh nghiệm: 20 – 35M (Senior Developer)
+ Trên 5 kinh nghiệm: 30M – 100M (tuỳ thuộc trình độ chuyên môn)
Trên thực tế mức lương có thể sẽ thay đổi dựa trên những nỗ lực cá nhân của bạn. Vì vậy, bạn hãy chứng tỏ bản thân là một Senior Developer thực thụ để có những phúc lợi xứng đáng.
Lời kết
Senior Developer là những cá nhân thuộc nhóm ngành đang phát triển bật nhất. Họ được quan tâm và có cơ hội được tào đạo bài bản hơn. Tuy vậy, bản thân chính họ cũng tự rèn luyện để bản thân được hoàn thiện hơn. Thông qua bài viết này, TopDev hi vọng bạn sẽ biết được thế nào là Senior Developer. Đồng thời, đây là những thông tin cơ sở để bạn tự nhìn nhận, đánh giá lại bản thân. Từ đó, điểm lại những thiếu sót trong kinh nghiệm, kỹ năng để lập kế hoạch bồi dưỡng cho bản thân. Chúc cho con đường phát triển ngành lập trình của các bạn sẽ thật sự may mắn!
Bài viết được sự cho phép của tác giả Edward Thien Hoang
Ngôn ngữ lập trình bản thân chúng không phải là 1 thành phần trong kiến trúc nhưng sẽ là thiếu sót nếu chúng ta không đề cập đến chúng trong loạt bài viết này.
Cùng điểm sơ qua lịch sử phát triển của các ngôn ngữ lập trình cùng các mô hình lập trình (programming paradigm) qua thời gian và các vấn đề mà chúng giải quyết.
1950S – NON-STRUCTURED PROGRAMMING (LẬP TRÌNH PHI CẤU TRÚC)
Assembly ~1951
Vào thời điểm sơ khai của lĩnh vực phát triển phần mềm, Assembly là ngôn ngữ hot nhất thời điểm bấy giờ. Nó sử dụng các lời gọi hàm bậc thấp như add, sub, goto và thao tác trực tiếp trên thanh nhớ. Mất khá nhiều thời gian chỉ để build 1 ứng dụng đơn giản. Để thực hiện một lệnh IF, ta cần đến vài dòng code, và sẽ là vài chục dòng code cho vòng loop… Lúc này, khả năng tái sử dụng và cấu trúc các thành phần hầu như là rất khó vì độ phức tạp của ngôn ngữ, các dòng lệnh chủ yếu được thực thi một cách tuần tự, nếu muốn sử dụng logic này ở chỗ khác thì chỉ có cách copy-paste.
1960S – STRUCTURED PROGRAMMING (LẬP TRÌNH CẤU TRÚC)
Algol ~1958
Lập trình cấu trúc là bước tiến hóa tiếp theo sau đó. Nó mang đến khả năng cấu trúc các dòng lệnh theo block, cung cấp các giao diện (key word) để sử dụng các lệnh if, else, loop, case, … và các sub-routines (giống như global method để reuse). Từ đây chúng ta có thể tập trung vào việc lập trình các flow của chương trình (thay vì phải đau đầu với các “mật mã” assembly). Ý tưởng về re-useable code cũng khởi nguồn ở giai đoạn này.
1970S – PROCEDURAL & FUNCTIONAL PROGRAMMING (LẬP TRÌNH THỦ TỤC & CHỨC NĂNG)
Pascal ~1970, C ~1972
Lập trình thủ tục và lập trình chức năng được giới thiệu vào những năm đầu của thập niên 70, với các đặc điểm như:
Procedures: Tập các dòng lệnh để thực hiện một công việc gì đó và không trả về dữ liệu
Functions: Tập các dòng lệnh dùng để tính toán trả về dữ liệu
Data structures: dùng để diễn đạt thông tin của một sự vật, sự việc, hoặc để nhóm các thông tin có cùng một mục đích vào trong đó. (Lưu ý lúc này vẫn chưa có OOP nên mình tránh dùng từ đối tượng ở đây)
Modules: Các file code hoặc tập tin đã được biên dịch có thể dùng cho những chỗ khác.
Trong giai đoạn này, ý tưởng về Event Oriented Programming cũng đã xuất hiện trong một báo cáo về MVC (sử dụng các event) của Trygve Reenskaug.
Như vậy, trong giai đoạn này, các ngôn ngữ lập trình đã làm tăng tính tái sử dụng các module, cũng như cho phép tạo ra các cấu trúc để gom nhóm data cũng như việc sử dụng event để phân tách các thành phần với nhau. (Key work cần nhớ: decoupling and modularity)
1980S – OBJECT ORIENTED PROGRAMMING
C++ ~1980, Erlang ~1986, Perl ~1987, Phyton ~1991, Ruby ~1993, Delphi, Java, Javascript, PHP ~1995
Một trong những mô hình lập trình linh hoạt và theo tôi là tốt nhất cho đến thời điểm hiện tại đó là OOP. Lập trình hướng đối tượng cho phép chúng ta phân tích các bài toán thành các thực thể được gọi là các đối tượng và xây dựng các dữ liệu, các hàm xung quanh các đối tượng này. Dữ liệu được liên kết với các hàm thành các vùng riêng mà chỉ có các hàm đó tác động lên, các hàm bên ngoài không được truy cập vào. Các đối tượng có thể tác động và trao đổi thông tin với nhau thông qua các thông điệp.
MỘT SỐ KHÁI NIỆM TRONG LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
ĐỐI TƯỢNG
Đối tượng là sự kết hợp giữa dữ liệu và thủ tục (còn gọi là phương thức) thao tác trên dữ liệu đó. Ta có công thức:
Đối tượng = Dữ liệu + Phương thức
LỚP
Lớp là một tập các đối tượng cùng loại (có cấu trúc dữ liệu và phương thức giống nhau). Một đối tượng sẽ thể hiện cụ thể từng lớp. Trong lập trình mỗi lớp được xem là một kiểu, còn các đối tượng sẽ là các biến có kiểu lớp khác.
ĐÓNG GÓI DỮ LIỆU
Trong lập trình cấu trúc các hàm được sử dụng mà không cần biết cụ thể nội dung. Người dùng chỉ cần biết chức năng của hàm cũng như các tham số để chạy hàm, không cần quan tâm đến những lệnh cụ thể bên trong. Người ta gọi chức năng đó là đóng gói dữ liệu.
Trong lập trình hướng đối tượng, cả chức năng và dữ liệu đều phải được đóng gói, mỗi đối tượng sẽ không thể truy cập trực tiếp vào các thành phần dữ liệu mà phải thông qua các thành phần chức năng để làm việc đó. Như vậy, đóng gói cho phép dữ liệu của đối tượng sẽ bị che đi một phần khi nhìn từ bên ngoài.
KẾ THỪA
Kế thừa là khả năng cho phép xây dựng một lớp mới dựa trên các cơ sở (định nghĩa) của một lớp có sẵn và có bổ sung phương thức hay thành phần dữ liệu. Khả năng sử dụng kế thừa các module chương trình rất dễ dàng mà không cần thay đổi module khác.
ĐA HÌNH
Tính đa hình sẽ xuất hiện khi có khái niệm kế thừa và có khả năng cho phép gửi cùng một thông điệp đến những đối tượng khác nhau mà không cần biết đối tượng nhận thuộc lớp dữ liệu nào, chỉ cần tập hợp các đối tượng nhận có chung hoặc gắn liền với một tính chất nào đó.
1990S – SUBJECT & ASPECT ORIENTED PROGRAMMING
Subject Oriented Programming gọi cho các biểu diễn khác nhau của các đối tượng, theo người đang “nhìn” vào nó. Ví dụ, trong khi con người có thể nhìn thấy gỗ khi nhìn vào cái cây, một con chim có thể thấy một lượng thức ăn và nơi trú ẩn. Để mô hình hóa việc đó trong lập trình, nó có nghĩa là thuộc tính và hành vi của đối tượng có thể khác nhau, tuỳ thuộc vào ai gửi thông điệp đến đối tượng.
Aspect Oriented Programming (AOP) – lập trình hướng khía cạnh: là một kỹ thuật lập trình (kiểu như lập trình hướng đối tượng) nhằm phân tách chương trình thành cách moudule riêng rẽ, phân biệt, không phụ thuộc nhau.
Khi hoạt động, chương trình sẽ kết hợp các module lại để thực hiện các chức năng nhưng khi sửa đổi 1 chức năng thì chỉ cần sửa 1 module.
AOP không phải dùng để thay thế OOP mà để bổ sung cho OOP.
SAU OOP
Sau OOP thì hầu như không có mô hình lập trình mới nào đáng chú ý. Tất cả đổ dồn vào việc tùy biến các ngôn ngữ lập trình hiện tại để tối ưu cho các mục đích cụ thể nhất định, các framework, ngôn ngữ dành riêng cho phát triển web, mobile hoặc 1 nền tảng nào đó như Go cho Google, Hack của Facebook, …
KẾT LUẬN
Chúng ta đã điểm qua sơ bộ về một số mô hình lập trình chính, tất nhiên là tôi không quá chú trọng về nội dung chi tiết, vì chúng đã được nhắc đến rất nhiều trên mạng internet. Phần tôi muốn nhấn mạnh ở đây chính là chiều hướng phát triển của các mô hình lập trình, chúng tiến hóa theo chiều hướng của Modularity (low coupling – liên kết lỏng lẽo) và Encapsulation (high cohesion – độ gắn kết cao). Trong những bài viết tiếp theo, chúng ta sẽ tiếp tục thấy sự phát triển của các mô hình kiến trúc cũng theo chiều hướng nhằm đạt được tối đa 2 tính chất quan trọng NHẤT vừa đề cập.
Nếu bạn muốn hiểu rõ hơn về low coupling và high cohension, tôi khuyến nghị nên đọc thêm về nó ở đây trước khi bắt đầu vào loạt bài tiếp theo.
Đây là bài viết trong loạt bài viết về “Tổng quan về sự phát triển của kiến trúc phần mềm“. Đây là loạt bài viết chủ yếu giới thiệu về một số mô hình kiến trúc phần mềm hay nói đúng hơn là sự phát triển của chúng qua từng giai đoạn, qua đó giúp chúng ta có cái nhìn tổng quát, up-to-date và là roadmap để bắt đầu hành trình chinh phục (đào sâu) thế giới của những bản thiết kế với vai trò là những kỹ sư và kiến trúc sư phần mềm đam mê với nghề.
Bài viết được sự cho phép của tác giả Trần Hữu Cương
Nguyên tắc KISS trong Java.
KISS là gì?
KISS ở đây là: Keep It Simple, Stupid! không phải “hun nhau” đâu nhé.
Hiểu nôm na thì KISS cõ nghĩa là giữ cho code của bạn thật đơn giản, càng đơn giản, ngắn gọn càng tốt.Bạn viết code, người khác vừa đọc đã hiểu bạn đang viết cái gì, code của bạn thực hiện cái gì thì bạn đang áp dụng thành công rồi đấy.
publicintaddTwoNumber(int a, int b){return a + b;}
Khi bạn đọc nó bạn có thể hiểu luôn method đó làm cái gì. Với những method có logic phức tạp hơn, dài dòng hơn thì bạn cần phải biết đặt tên biến, tên hàm, comment thế nào để cho code của bạn dễ hiểu. (Có thời gian thì bạn hãy đọc cuốn ‘clean code’ của Robert C. Martin, bạn sẽ pro ngay mấy cái này =)) )
Ví dụ 2:
mình có 2 method đều thực hiện trả về true nếu số truyền vào là số chẵn:
Rõ ràng, method 1 nhanh hơn method 2 vì nó thực hiện trực tiếp với bit. Nhưng method 2 lại dễ hiểu hơn, người đọc không cần nhớ lại toán tử ‘&’ thực hiện như nào.
Ở đây mình chọn method 2 vì nó dễ hiểu, rõ ràng. Còn method 1 có nhanh hơn nhưng tính tổng thể thì nó không nhanh hơn quá nhiều chỉ tính bằng mini giây (chỉ khi nào bạn thực hiện lập trình nhúng, big data… thì có lẽ lúc đó người ta sẽ xem xét lại.)
Ví dụ 3:
bạn có biết hàm tìm kiếm string cài đặt sẵn trong java được viết theo thuật toán ‘Naive Search’, trong khi bạn chỉ cần lên google là có hàng tá thuật toán cùng chức năng với ‘Naive Search’ mà có tốc độ cao hơn nhiều nhưng người ta vẫn dùng ‘Naive Search’ vì nó dễ hiểu, dễ cài đặt. Còn nếu bạn muốn nhanh hơn thì tất nhiên phải viết lại method mới phù hợp cho mục đích của mình rồi.
Với cấp độ cao hơn, khi mà người ta áp dụng các pattern, framework… bản chất code đã trở nên phức tạp hơn nhiều nên tùy theo nhu cầu (khả năng mở rộng, chịu tải, nâng cấp version…), thực sự cần thì người ta mới áp dụng. Chứ mấy cái app con con bạn cũng áp dụng vào vào thì nó sẽ khiến bạn tốn thời gian viết code, thời gian debug…
Nếu bạn đọc code của đứa nào đó thấy khó hiểu thì đừng vội cho đó là cao siêu, hãy hỏi nó sao code mày khó hiểu thế =))
Bài viết được sự cho phép của tác giả Trần Khôi Nguyên Hoàng
Nguyên nhân
Mình không dùng Facebook nhiều mà chỉ dùng mỗi Messenger để nhắn tin chat chit cho công việc và bạn bè – Mặc dù mình thích thằng Telegram hơn, ngon hơn thằng Messenger của anh Mark 3000 lần. Thằng Messenger thì hiện tại hình như bên Windows thì đã có Official rồi thì phải, còn bên Linux như con ghẻ, chả có gì, toàn phải dùng bản Web App. Mỗi lần sử dụng toàn phải tìm lại trong đống tab của mình. Nên mình tim hiểu tự làm một cái thử xem. Sau một lhời gian tìm hiểu thì thấy có một package làm giúp cho mình việc này, tất nhiên nó không phải là native app, mà làm wrapper của Electron.
Nativefier là một wrapper của Electron dùng để tạo Desktop Application cho Linux và các platform khác. Tuy nhiên mình chỉ dùng cái này trên Linux thôi nên không test được ở platform khác nha. Ngoài ra, có thể vọc vạch thêm một chút cho application này, ví dụ như inject javascript hay css.
Cài đặt và cách sử dụng
Cài đặt package này, rồi gắn global flag rồi để sau này có gì sử dụng cho nó tiện cũng được. Nếu không thì bỏ cái global flag ra cũng ok.
sudonpm i nativefier -g
Bash
Sử dụng thì đơn giản cực kỳ. Sử dụng nativefier để convert web app messenger.com cho platform linux.
nativefier https://www.messenger.com -p linux
Bash
Sau khi chạy command này xong thì nativefier sẽ generate ra một folder là Messenger-linux-x64
Cấu trúc folder khi generate ra
Tới lúc này thì start lên với câu lệnh
./Messenger.com
Bash
Thế là xong, có một Desktop Application rồi.
Mở rộng
Tất nhiên là nếu như vậy không thôi thì cũng không tận dụng hết được tính năng của Nativefier. Ở đây thì mình sẽ mở rộng thêm một chút, mình sẽ làm Dark Mode cho con ứng dụng ghẻ của mình. Electron là một framework dùng để build desktop application bằng html, css, javascript. Thì thằng nativefier này được build dựa trên thằng electron. Như vậy thì muốn thay đổi giao diện của ứng dụng thì chỉ việc add thêm dark mode css là xong. Để inject được css trong natifier thì dùng flag —inject. Vì thế mình sửa code lại một tí.
nativefier https://www.messenger.com -p linux --inject dark.css
Bash
Sau đó vào trong Messenger-linux-x64/resources/app/inject ****để sửa file dark.css như sau. Mình bợ của anh nào đấy trên github
Thế là có một Messenger Dark Mode Desktop Application rồi.
Các bạn có thể xem thêm các API hay ho khác của Nativefier ở đây nhé. Còn nhiều thứ hay ho có thể dùng lắm.
Đến đây thì có vẻ như chưa đủ, mình còn phải tạo shortcut cho nó để bấm là chạy nữa chứ. Lúc này thì phải dùng một số câu lệnh SHELL của Linux.
Đầu tiên là tạo shortcut cho nó tên là shortcut.sh
#!/bin/shset -e
WORKING_DIR=`pwd`THIS_PATH=`readlink -f $0`cd`dirname${THIS_PATH}`FULL_PATH=`pwd`/Lotion
cd${WORKING_DIR}cat<<EOS > Messenger.desktop
[Desktop Entry]Name=Messenger
Name[en_US]=Messenger
Comment=Unofficial Facebook Messenger application for Linux
Exec="${FULL_PATH}/Messenger"Terminal=falseCategories=Social
Type=Application
Icon=${WORKING_DIR}/icon.png
StartupWMClass=Messenger
EOS
chmod +x Messenger.desktop
## This can be updated if this path is not valid. cp -p Messenger.desktop ~/.local/share/applications
Trên đây đơn giản chỉ là một package giúp mình convert một Web App ra Desktop App. Tuy nhiên, nếu Custom tốt thì cũng không đến nổi nào. Ngoài ra thì mình có thể xài thằng này để làm một số App cho mình, ví dụ như thằng Zalo, hay Whatsapp. Cũng là một ứng dụng, vì có app vẫn thích hơn là dùng browser.
CV IT Manager thiếu kinh nghiệm? Chưa năm bắt về những cơ hội? Đâu là những suy ngẫm về giá trị của tuổi 25?
Con số 25 nói lên được nhiều điều. Chắc chắn bạn đã trải qua nhiều vấp ngã đầu đời và các áp lực từ cuộc sống. Có khi nào bạn đã từng ngẫm lại những gì đã trôi qua hay chưa? Hay chỉ đơn thuần là mãi bị cuốn vào guồng quay của công việc. Nếu chưa thì có lẽ, bài viết này là dành các bạn đấy!
Nhìn nhận tổng quan: Điều gì đến rồi cũng sẽ đến, mọi chuyện rồi sẽ ổn thôi
Mọi chuyện khó khăn, như cơn gió thoảng – những gì trắc trở, tệ hại nhất rồi sẽ chóng qua thôi.
Tuổi 25 đều có những điều đáng suy ngẫm. Vậy điều gì khiến bạn phải lắng lại để cảm nhận?
Ví dụ như thuở mới vào nghề, bạn gặp nhiều áp lực khi quyết định theo đuổi ngành IT. Bạn chưa biết cách viết một CV IT Manager chuyên nghiệp. Chưa kể nếu bạn apply thử sức ở nhiều vị trí khác nhau như Mobile App Developer, bạn cần phải viết CV IT tiếng Anh (CV IT English), liệu bạn có tự tin về khả năng của mình? Khi quyết tâm và dành sự tập trung cho nó, bạn nhận thấy nó rất mệt mỏi.
Đồng thời các vấn đề khác về lương, phúc lợi; mối quan hệ giữa bạn và sếp, đồng nghiệp; sự thăng tiến đều là những điều khiến bạn phải suy ngẫm rất nhiều.
Đừng để bản thân rời vào tuyệt vọng!
Đôi khi, bạn đừng để bản thân lạc lõng với những áp lực. Vì điều đó sẽ khiến bạn đánh mất đi nhiều cơ hội đang hiện hữu chung quanh mình. Tất nhiên, cũng đừng để những cơ hội xấu kéo bạn đi quá xa. Việc nhận ra được những cảm xúc, mong muốn của bản thân rất quan trọng. Chính vì vậy, đừng bao giờ cho phép bản thân đánh mất chính mình. Hãy cố gắng phát huy hết những khả năng nếu được trao cơ hội.
25 tuổi, mọi mùi vị của thanh xuân có cái nào chưa từng trải nghiệm đâu. Quan trọng là hãy học cách trân trọng những mối quan hệ. Nhận thức đúng, sống tích cực để không bị chi phối quá nhiều bởi những tác động từ môi trường xung quanh.
Đánh giá hiện tại – Chưa muộn để xác định tầm nhìn dài hạn
Có thể nói, tuổi 25 là tuổi chạm độ chín của việc phát triển sự nghiệp. Tuy nhiên, điều này không phải là mặc định cho mỗi người. Việc xây dựng và phát triển sự nghiệp đều khác nhau. CV IT Manager
Tầm nhìn dài hạn rất quan trọng, liệu bạn đã thật sự đầu tư cho nó chưa?
Đây cũng là điều TopDev muốn chia sẻ. Bạn không nên so sánh bản thân với sự thành công của người khác để rồi quá tự ti. Một người bạn dev của mình với mức lương được tăng lên 20; thậm chí 30 củ do họ nhận được sự tín nhiệm. Điều này đồng nghĩa họ cũng phải nhận những trách nhiệm lớn hơn. Việc họ thành công có thể gói trọn trong 3 từ “đúng thời điểm”. Đừng quá áp đặt để rồi trở nên chán nản! Vì mỗi người đều sẽ có những thời điểm phù hợp cho riêng mình để tỏa sáng.
Điều bạn cần làm là đảm bảo sẵn sàng lên một kế hoạch dài hạn cho sự nghiệp. Đồng thời linh hoạt xử lý kế hoạch đầu tư cho nó. 25 chưa phải là thời điểm quá muộn để bạn tạo dựng sự nghiệp.
Phấn đầu từ junior lên seniorhoặc leader trong lĩnh vực IT, từ nhân viên thành người quản lý/nhà lãnh đạo nhân sự trẻ là điều khả thi nếu bạn có đủ sự cố gắng và niềm tin vào chính mình.
Những hành động cụ thể
Chủ động đầu tư cho bản thân!
Dù bạn đang ở giai đoạn nào, bạn vẫn phải chủ động tìm kiếm sự phát triển. Việc học tập, đầu tư cho bản thân rất cần thiết. Ví dụ khi đi xin việc vị trí Programmer, ngoài các kỹ năng thì IT Programmer CV, CV IT Manager,… được xem là một “tấm vé quyền năng” giúp bạn ghi điểm với nhà tuyển dụng. cv it manager
Hãy quan tâm đến việc đầu tư cho bản thân
Nhiều cá nhân họ cho rằng việc đào tạo và phát triển năng lực chuyên môn thuộc về trách nhiệm của chính tổ chức/doanh nghiệp. Đó là một sai lầm lớn. Không phải công ty nào cũng có những nhà quản trị nhân sự đủ tầm nhìn để vạch ra những đường hướng, chiến lược; hoạch định ra lộ trình thăng tiến phù hợp cho mỗi nhân viên. Đừng suy nghĩ ỷ lại vào công ty! Vì có thể bạn sẽ gặp những cú twist đầy bất ngờ đó.
Một điều đặc biệt quan trọng là bạn phải tự đầu tư cho bản thân. Kiến thức của bạn tự tìm tòi thì mới đáng giá. Vì chúng theo bạn, được cập nhật và phát triển hơn mỗi ngày.
Lợi thế tiếp cận từ mạng lưới quan hệ xã hội
Năng lực, sự may mắn, xây dựng, tạo cầu nối liên kếtgiữa các mối quan hệ đều là những yếu tố giúp gia tăng cơ hội thành công. Tuy nhiên, nhiều người cho rằng việc thiết lập quan hệ để thăng tiến là điều không mấy tự hào. CV IT Developer
Tuy nhiên, nếu đủ tư duy của một người thành công, bạn cần nhiều mối quan hệ. Và tất nhiên, chúng được tạo lập dựa trên uy tín, sự phù hợp khả năng chuyên môn. Như việc khi bạn đang là một newbie về công nghệ, việc nắm bắt một CV cho sinh viên IT mới ra trường (CV IT student) dường như còn hạn chế. Hãy tin rằng bạn thật sự có năng lực để tạo ra sự kết nối các mối quan hệ. Sức mạnh từ mạng lưới xã hội được xem như một “vũ khí” lợi hại để gia tăng lợi thế cạnh tranh cho một cá nhân.
Lưu ý, bạn không thể thành công nếu chỉ cố gắng tạo sự kết nối đơn thuần. Việc xây dựng một mạng lưới tốt đòi hỏi bạn phải có đủ khả năng giao tiếp, đàm phán, tư duy phản biện. Điều này giúp họ nhận thấy mục đích nghề nghiệp và những mong muốn phát triển của bạn. Từ đó, mới có đủ cơ sở để tạo dựng mối quan hệ cho đôi bên cùng có lợi. Nhiều khi bạn thực hiện những điều thú vị sẽ khiến chúng ta tạo ra sự thay đổi tích cực hơn trong công việc.
Lời kết
Không bao giờ là quá trễ cho những ai nỗ lực, phấn đấu. Những cơ hội mới sẽ luôn mở ra và điều quan trọng là bạn có kiên nhẫn chờ đợi và chớp lấy thời cơ. Những điều suy ngẫm ở tuổi 25 sẽ trở thành động lực hay là khủng hoảng, tất cả phụ thuộc vào nhận thức và sự cố gắng cá nhân của bạn.
MMA Impact 2020 – sự kiện lớn nhất về tiếp thị di động trong năm sẽ có sự góp mặt của những chuyên gia hàng đầu từ lĩnh vực tiếp thị, quảng cáo và truyền thông. Hãy cùng đặt mua vé ngay hôm nay để không bỏ lỡ cơ hội tham gia diễn đàn đặc biệt sẽ diễn ra vào ngày 19 tháng 11 sắp tới!
Dàn diễn giả uy tín của MMA Impact Việt Nam 2020 – Khi “anh tài” hội tụ
MMA Impact Việt Nam 2020 vinh dự chào đón sự tham gia của những chuyên gia với kinh nghiệm dày dặn nhiều năm trong nghề. Tất cả sẽ mang đến những góc nhìn đa chiều, từ đó đưa ra các giải pháp sáng tạo cho các vấn đề “hot nhất” trong ngành.
Sự kiện MMA Impact 2020 với sự tham gia của những chuyên gia với kinh nghiệm dày dặn nhiều năm trong nghề sẽ mang đến những góc nhìn đa chiều, từ đó đưa ra các giải pháp sáng tạo cho các vấn đề “hot nhất” trong ngành.
Sự kiện MMA Impact 2020 với sự tham gia của những chuyên gia với kinh nghiệm dày dặn nhiều năm trong nghề sẽ mang đến những góc nhìn đa chiều, từ đó đưa ra các giải pháp sáng tạo cho các vấn đề “hot nhất” trong ngành.
Đến với Impact 2020, người tham gia sẽ được luận bàn về một xu hướng nổi bật trong năm 2020: Purposeful Marketing (Tiếp thị Ý nghĩa) và vai trò cốt lõi của phương châm này trong ngành tiếp thị hiện đại. Trong năm 2020 với đại dịch COVID-19 diễn biến phức tạp, ngành truyền thông và công nghệ đã chứng kiến tốc độ phát triển kỷ lục để đáp ứng được nhu cầu mua sắm trực tuyến của người tiêu dùng. Vì thế, các doanh nghiệp cần phải tìm được “purpose” (mục đích) cho thương hiệu của mình, từ đó có thể tạo dựng được những chiến dịch quảng bá hiệu quả, có sức ảnh hưởng lan toả và lâu dài. Người tham dự sẽ được chia sẻ về tầm quan trọng của Purposeful Marketing cũng như cách nắm bắt sức mạnh của nó để vượt qua đại dịch lần này.
Danh sách diễn giả sẽ góp mặt tại MMA Impact Việt Nam bao gồm ông Sundar Bharadwaj – Giáo sư Marketing của Trường Đại học Georgia và Trường Terry College of Business, bà Trâm Nguyễn – Country Director của Google Việt Nam/Lào/Campuchia, ông Rohit Dadwal – Managing Director của MMA APAC, ông Tom Simpson – Senior Vice President của AdColony APAC, bà Bessie Lee – Co-founder và CEO của Withinlink, và nhiều chuyên gia đầu ngành khác.
Cơ hội lắng nghe những bài học đáng giá sau một năm 2020 đầy biến động
Xoay quanh chủ đề “Kiến tạo tương lai của Tiếp thị hiện đại”, MMA Impact 2020 được thiết kế để nâng cao và xây dựng tiềm năng “modern marketing” của các nhà tiếp thị. Không chỉ mang tới cho người tham dự một kho tài liệu lớn thông qua các báo cáo do MMA Global tổng hợp, hơn hết đây là dịp để các chuyên gia, đối tác của MMA bàn bạc về những vấn đề “nóng” nhất của ngành tiếp thị.
MMA IMPACTCác chuyên gia tiếp thị chia sẻ về tình hình tiếp thị di động tại Việt Nam ở sự kiện của MMA
Trong panel với chủ đề “Sự trỗi dậy của nền kinh tế Internet Việt Nam”, đại diện từ Google sẽ chia sẻ thứ hạng của Việt Nam trên trường quốc tế dựa trên mức độ tăng trưởng và doanh thu của nền kinh tế Internet. Phiên đối thoại sẽ đào sâu vào xu hướng mới của người tiêu dùng hiện nay, khi họ bắt đầu chuyển qua tiêu dùng trên Internet ở nhiều lĩnh vực đa dạng như bán lẻ, giáo dục, và tài chính. Người tham dự cũng sẽ được lắng nghe các thương hiệu hàng đầu chia sẻ cách mà họ đang thúc đẩy tăng trưởng cho doanh nghiệp trong nền kinh tế Internet hiện nay.
Tiếp theo, làm thế nào để thiết kế một chiến dịch marketing thành công trong thời dịch? Anh Cường Nguyễn từ Biti’s sẽ chia sẻ cách mà thương hiệu quốc gia này đã đối mặt với COVID-19 một cách khác biệt và truyền cảm hứng, tạo nên một chiến dịch quảng bá ý nghĩa và thành công nhất của Biti’s nửa đầu năm 2020.
Một trong những chủ đề thú vị khác tại MMA Impact 2020 chính là “Live Streaming trong Thương mại điện tử 4.0”. Bà Bessie Lee từ Withinlink sẽ bàn về một trong những xu hướng đang gây sốt tại Trung Quốc: live streaming. Với việc 5G sắp được phổ biến, live streaming là một kênh bán hàng tiềm năng và đầy sáng tạo giúp doanh nghiệp có thể kết nối nhanh hơn với khách hàng. Bà Bessie Lee cũng sẽ đề cập đến những thách thức mà doanh nghiệp sẽ phải đối mặt khi tích hợp live streaming vào chiến dịch kinh doanh của mình.
Ngoài ra, một số chủ đề tiêu biểu khác sẽ được thảo luận và chia sẻ tại MMA Impact bao gồm: “Số liệu về người tiêu dùng nông thôn tại Việt Nam” từ Cốc Cốc, “Tiếp thị bằng Influencer” từ Samsung, bàn tròn “Mở khóa những cơ hội tiềm ẩn xung quanh ngành Trò chơi điện tử” với sự tham gia của AdColony và Oppo. Qua những chia sẻ cực kỳ giá trị này, người tham dự có thể trau dồi, cập nhật những xu hướng và thách thức sắp tới của ngành để chuẩn bị cho kế hoạch 2021 của doanh nghiệp mình.
MMA Impact Việt Nam 2020 sẽ được tổ chức vào lúc 8:00 – 12:00 ngày 19/11/2020 tại TP.HCM Tất cả các CEO và CMO từ các doanh nghiệp, nhãn hàng, agency, tập đoàn công nghệ, viễn thông,… đều được chào đón tại sự kiện.
Và đừng quên tham dự Đêm trao giải Smarties để cùng theo dõi danh sách các chiến dịch tiếp thị di động xuất sắc nhất sẽ được vinh danh vào cùng ngày – 19/11/2020 sắp tới.
Giới thiệu về Hiệp hội Tiếp thị Di động (MMA)
MMA là hiệp hội tiếp thị di động thương mại phi lợi nhuận hàng đầu thế giới bao gồm hơn 800 công ty thành viên, đến từ gần 50 quốc gia trên thế giới. Các thành viên của chúng tôi đến từ mọi mảng trong hệ sinh thái tiếp thị di động, bao gồm brands marketer, agency, nền tảng công nghệ, công ty truyền thông,… Sứ mệnh của MMA là đẩy nhanh quá trình chuyển giao và đổi mới của marketing thông qua thiết bị di động, thúc đẩy tăng trưởng kinh doanh với sự tương tác mạnh mẽ hơn của người tiêu dùng. Dẫn dắt sứ mệnh của MMA là bốn trụ cột cốt lõi: Nuôi dưỡng cảm hứng bằng cách thúc đẩy sự đổi mới cho các CMO; Xây dựng tiềm năng tiếp thị di động cho các tổ chức tiếp thị thông qua việc cung cấp kiến thức và sự tự tin; Nâng cao hiệu quả và tác động của thiết bị di động thông qua nghiên cứu ROI hữu hình; và ủng hộ các nhà tiếp thị di động. Ngoài ra, các Committee của MMA còn hợp tác để phát triển và hỗ trợ các phương pháp tốt nhất và tiên phong trong những phát triển đúng tiêu chuẩn.
Các thành viên của MMA tại Việt Nam bao gồm Facebook, Google, CocCoc, Adtima, GroupM, Coca-Cola, Unilever,… và rất nhiều tên tuổi lớn khác. Trụ sở toàn cầu của MMA được đặt tại New York với các hoạt động khu vực ở Châu Âu / Trung Đông / Châu Phi (EMEA), Châu Mỹ Latinh (LATAM) và Châu Á Thái Bình Dương (APAC). Để biết thêm thông tin về MMA, vui lòng truy cập www.mmaglobal.com.
Apple có cung cấp cho chúng ta công cụ tuyệt vời để test code-Swift:playground. Chúng ta sẽ sử dụng tool playgroundđể học swift3.
Bạn click vào “Get started with a playground ”
Các bạn click next và chọn nơi lưu project
Và đây là giao diện giúp chúng ta code.
Array
Các phần tử trong 1 array phải chung kiểu dữ liệu. Có thể khai báo array bằng những cách sau:
Khai báo mảng rỗng
let emptyArr =[Int]() // mảng Int rỗnglet emptyArr : Array<Int> = [] // mảng int rỗng
Thêm mới 1 phần tử:
arr.append(6) // thêm vào cuối mảng arr.insert(0, atIndex: 0) // thêm mới theo index
Dictionary
Dictionary dùng để chứa các biến có cùng kiểu dữ liệu. Khác với array là dictionary gọi biến theo key – value chứ không phải theo index.
Khai báo dictionary theo 2 cách như sau:
var dict : Dictionary<String,String>=[“HN”:“HaNoi”,“HCM”:“HoChiMinh”];var dict2 :[String : String]=[“HN”:“HaNoi”];
II.Biến và hằng
1.Biến
Trong ngôn ngữ Swift, các biến được khai báo bằng từ khóa “var”
Khai báo biến dùng từ khóa var theo sau là tên biến được khởi tạo giá trị. Kiểu dữ liệu của biến khai báo theo cách này phụ thuộc vào giá trị nó khởi tạo. Bạn có thể khai báo nhiều biến trên một dòng, mỗi biến cách nhau bởi dấu “,”.
var Tên biến: kiểu dữ liệu = Giá trị
Ví dụ:
var str: String =“Học swift”
//Khai báo biến, khởi tạo giá trị cho nó là //số nguyênvar bien1 = 123 //Khai 2 biến trên một dòng bien2 và biến3 var bien2 = “XYZ”, biến3 = bien1 + 10
2.Hằng
Khai báo hằng số
– Hằng số để sử dụng lưu giá trị nào đó mà không cần thay đổi,không giống với biến chúng ta có thể thay đổi được giá trị nhưng khi chúng ta đã khai báo 1 hằng số thì không thể thay đổi giá trị cho hằng số đó.
– Để khai báo 1 hằng số trong swift chúng ta sử dụng từ khóa “let”,cũng giống với biến thì hằng số cũng có nhiều cách khai báo hằng đó là có thể gắn luôn kiểu dữ liệu hoặc không gắn kiểu dữ liệu và gắn giá trị mặc định hoặc không.
Khi chúng ta không gắn kiểu giá trị cho hằng số mà gắn giá trị mặc định thì lúc đó Swift sẽ tự động gắn kiểu cho hằng đó như kiểu của giá trị.
Để khai báo hằng số thì dùng từ khóa let theo sau là tên hằng và giá trị hằng số.
Ví dụ:
let SỐ_PI =3.14
3.Quy tắc đặt tên biến và hằng
Tên biến và hằng bạn có thể gõ tên bất kỳ (kể cả dùng ký tự Unicode, gõ tiếng việt …), miễn là đảm bảo những nguyên tắc sau sẽ được chấp nhận:
Không được có khoảng trắng, ký hiệu toán học (+ / …), mũi tên (← → ↑ ↓ …), các tên và ký hiệu dùng bởi ngôn ngữ Swift trong tên biến
Tên biến có thể chứa ký tự số nhưng không được phép dùng số để bắt đầu tên biến. bien123 thì được, 123bien thì không được
Những gì sắp kể ra ở đây là về hành trình của mình đến với thế giới open source, đây là một dự án làm cho vui nhưng rốt cuộc lại đóng vai trò khá quan trọng đối với con đường làm kĩ thuật của mình, nhất là khi nó cũng mở ra khá nhiều cơ hội lúc mình đặt chân đến Mỹ (khi có dịp mình sẽ nói về cái này sau). Từ đó đến giờ cũng khá lâu rồi, nên mình không thể nhớ hoàn toàn mọi chi tiết cũng như rất nhiều tư liệu trong quá trình viết game này đã bị mất, hôm nay quyết định viết ra chứ để lâu nữa có khi lại quên sạch luôn.
Vào khoảng nửa đầu năm 2015, thì trò chơi Agar.IO bắt đầu trở nên nổi tiếng và tình trạng chơi Agar trong giờ làm việc dần trở nên phổ biến, team mình lúc đó cũng không ngoại lệ
Thú thực thì công ty outsource, ở thời điểm mới thành lập, dự án cũng không có nhiều và gắt nên anh em cũng khá rảnh rỗi. Rảnh đến mức mình cài luôn Diablo III vào máy để chơi cơ mà.
Nhưng chơi game cả ngày thì cũng chán, thế là mình chuyển qua làm game ở trên công ty luôn (thời điểm đó mình vẫn còn hoạt động trong mảng game dev, đối với mình, làm game là đam mê, còn chuyện đi làm outsource cũng chỉ là vì cơm áo gạo tiền, quyết không bán mình đi làm game vì tiền, một phần khác thì vì cty outsource này trả lương cũng khá là cao).
Làm game gì bây giờ nhỉ? Lúc đó mình đang chơi 2 game là Diablo và Agar, làm Diablo thì đương nhiên là không làm nổi rồi, trình đếu đâu, thôi thì làm game Agar vậy.
Bản prototype đầu tiên
Tính từ lúc start đến lúc hoàn thành bản prototype chơi được đầu tiên là khoảng 1 buổi sáng, chắc tầm 3 tiếng, bản prototype khá đơn giản, hoàn toàn không có chế độ chơi online, nhưng các thành phần cơ bản của gameplay thì đều có đầy đủ:
Cơ chế dịch chuyển/điều khiển, collision detection (nói cho sang, chứ chỉ là kiểm tra một điểm có nằm trong một đường tròn không thôi), food spawning, cơ chế ăn food, cơ chế growth khi ăn.
Game được render trên một thẻ <canvas>, xóa toàn bộ màn hình sau mỗi lần di chuyển
Toàn bộ diện tích game là diện tích của màn hình hiện tại, chưa có scrolling và viewport
Thực ra ban đầu mình không có ý định làm bản online, mà dự định sẽ viết thêm bot và chơi offline. Nhưng mấy anh bạn trong team sau khi thấy mình làm ra được thế thì muốn mình share ra để chơi chung, nên đành phải viết thêm chức năng online.
Bản prototype tiếp theo: Multiplayer
Việc add thêm chức năng multiplayer cho một bản prototype game đang chạy offline cũng có nhiều cái thú vị cần nói tới, vì ngay từ bước này mình mắc phải nhiều sai lầm nghiêm trọng nhưng bản thân mình lúc đó chưa hề hay biết.
Về cơ bản thì logic của game vẫn được xử lý hoàn toàn trên phía client (!!!), server gần như chỉ làm nhiệm vụ nhận và broadcast các sự kiện được truyền lên từ các client.
Ví dụ có 2 player cùng kết nối vào game, khi player A di chuyển đến một vị trí (x, y) thì nó sẽ gửi một tín hiệu đến server, bảo là “Ê, tao chạy đến (x, y) nè”, server sẽ nhận tín hiệu đó và thông báo cho tất cả những player khác rằng “Chúng mài ơi, thằng A nó chạy đến (x, y) nhá”.
Hoặc khi player B ăn được một miếng food, thì nó sẽ thông báo lên server là “Này, tao vừa ăn được một cục, kích thước của tao giờ +1 rồi nhé”, với bản chất là một cái loa phóng thanh, server cũng sẽ hét lên rằng “Bớ làng nước ơi thằng B nó tăng thêm một đơn vị rồi kìa”.
Nếu quan tâm, các bạn có thể đọc thêm về toàn bộ những cách liên lạc từ các client lên server trong phiên bản đầu tiên này tại đây Game Architecture – huytd/agar.io-clone.
Sau khi có bản multiplayer, mình liền share cho mấy anh em trong team chạy thử, kết quả có vẻ như khá thành công, mình quyết định sẽ chia sẻ mã nguồn lên GitHub, kèm theo đó là viết một bản document thiệt hoành tráng mô tả cách xây dựng game của mình.
Lên sóng
Đây là commit đầu tiên khi game được publish lên GitHub: edf3fec.
Tiếp sau đó, mình share cái repo này lên Hacker News và nhận được khá nhiều sự chú ý của cộng đồng, đứng ở vị trí top 1 được hơn 1 ngày, kết quả là lượng star cho project tăng lên vùn vụt, đó cũng là lần đầu tiên mình tạo được nhiều sự chú ý đến vậy trên phạm vi ngoài nước.
Từ đó kéo theo rất nhiều chuyện vui, như là, một anh thầy giáo đến từ Brazil đã sử dụng source game của mình và deploy lên mạng nội bộ của trường cho học trò chơi, từ đó ảnh có thể ngắt hoàn toàn internet trong lớp, không cho lũ trẻ duyệt web trong giờ học nữa, cơ mà đám trẻ rất thích. Và rất nhiều người cũng gửi mail đề nghị mình làm freelance cho họ một bản game hoàn chỉnh để cạnh tranh với Agar.io, hoặc clone thành một trò có phong cách giống vậy, tất nhiên nhận ra tính chất chụp giựt của các con buôn, và tinh thần làm vì đam mê chứ không bán rẻ công sức, nên mình đã từ chối, giờ nghĩ lại thấy hơi tiếc tiền.
Bên cạnh đó cũng có rất nhiều bài học quý giá mà mình nhận được trong quá trình cộng tác với những người bạn không quen biết từ khắp nơi trên thế giới.
Đập đi làm lại
Gần như ngay lập tức sau khi mình publish source lên mạng, rất nhiều người đã thấy ngay sai lầm về mặt design trong kiến trúc client-server mà mình sử dụng, vì nó hoàn toàn quá dễ để hack.
Vì game logic được kiểm soát bằng cách để cho client gửi messages lên server, và server phân phát lại cho toàn game, một client hoàn toàn có thể hack tọa độ hoặc hack tăng kích thước lên cực bự, hoặc nếu thích thì có thể giết toàn bộ các player khác chỉ bằng việc gửi lên server vài messages đã được thay đổi.
Vì thế nên mình đã phải viết lại toàn bộ sau khi publish source lên GitHub (xem commit 547134c)
Việc kiểm soát logic của game (dịch chuyển, cập nhật tọa độ các player, collision detect, xử lý việc ăn và bị ăn của các player,…) phải được thực hiện hoàn toàn ở phía server, và client chỉ làm một nhiệm vụ duy nhất là render ra theo những gì server bảo.
Nếu mà nói về Networking Programming cho game thì nó rất là rộng, rộng đến mức có thể tách nó thành một phạm trù riêng và không liên quan gì đến chuyện làm game luôn, chính vì thế nên mình lười, không học cho nên đến lúc trước khi đụng phải vấn đề này, mình cũng chỉ biết mang máng là cách làm của mình nó sai lè ra đấy, nhưng không hình dung được phải làm sao cho nó đúng. Rất may, nhờ việc khoe cái ngu của mình lên mạng, nên mình đã chữa được cái ngu đấy của bản thân.
Một lần khác, project lại nhận thêm một issue nữa để bàn về vấn đề tại sao không sử dụng một cấu trúc dữ liệu khác tốt hơn thay cho việc dùng mảng để quản lý player.
Nói về vấn đề này, có thể hiểu nôm na rằng, ban đầu, tất cả các player được lưu vô một mảng ở trên server, và khi có sự tương tác xảy ra giữa các user, server sẽ phải kiểm tra bằng cách duyệt hết toàn bộ mảng đó:
// khởi tạo mảng chứa các playerconst players = [];
// khi có player join vào game thì đưa vô mảng
server.on('playerJoined', (player) => players.push(player));
// kiểm tra va chạm giữa các players khác và player Afor (let player of players) {
if (hitTest(playerA, player)) {
// ... do something ...
}
}
Tất nhiên làm như vậy thì rất ngu, vì server phải tốn công xử lý cho cả những user mà trên thực tế đang ở cách nhau rất xa (đầu screen và cuối screen chẳng hạn).
Sau khi thảo luận, mọi người thống nhất sẽ dùng Quadtree để quản lý các player theo tọa độ tương ứng, từ đó giúp cho việc tìm ra player nào đụng nhau hiệu quả hơn. Thú thực thì đây cũng là một thứ mình chưa bao giờ đụng đến, và chỉ được biết về nó sau cuộc thảo luận này, ngay cả việc implement cũng do một anh bạn tốt tính nào đó thực hiện giúp luôn .
Trên đây chỉ là ví dụ cho hàng tá thứ mà mình học được từ cộng đồng sau khi public mã nguồn của game lên GitHub.
Miniclip, DCMA và hưởng lợi
Phải nói thêm là, project của mình không phải là project duy nhất liên quan đến game Agar.IO ở thời điểm này, nhưng phần lớn các dự án khác trên GitHub lúc bấy giờ, bên cạnh các dự án written from scratch giống như mình làm, còn có các dự án kiểu rip off lại game cũ bằng cách dịch ngược client, deploy lại lên một server khác để gắn ads vào, hoặc viết lại client nhưng reverse engineering lại protocol để kết nối vào server chính,…
Sau khi game Agar.IO (bản gốc) được Miniclip mua lại, gần như ngay lập tức, họ gửi request đến GitHub để gỡ xuống hàng loạt các dự án liên quan đến Agar.IO hoặc có xài tên gọi Agar.IO
Lúc đó thì mình nghĩ, “thôi thế là xong phim con mẹ nó rồi”, vì project của mình kiểu gì cũng sẽ nằm trong danh sách bị gỡ bỏ. Nhưng bất ngờ thay, sau một tuần thì mọi thứ vẫn an toàn.
Đồng thời, nhờ việc các “đối thủ cạnh tranh” bị tiêu diệt hết, và “đối thủ chính” đã bị hốt về tay Miniclip, hàng loạt những thủ đoạn kiếm tiền trắng trợn được đưa vào Agar.IO khiến cho cộng đồng bất mãn, và họ bắt đầu đi tìm một giải pháp vừa open source vừa có thể self-hosted được, tất nhiên ứng cử viên sáng giá không ai khác ngoài kẻ còn sót lại sau cơn bão dữ, là dự án của mình nên số lượng star cho dự án lại càng tăng lên từng ngày, từng ngày một.
Bên cạnh vai trò làm kẻ thay thế đại diện cho chính nghĩa trước thủ đoạn “xảo trá con buôn” của nhà phát hành game bản gốc, project của mình còn đóng vai trò là một nguồn tư liệu tham khảo cho nhiều developer khác khi họ có ý định bắt tay vào làm một game giống như Agar.IO – hẳn là bạn đang thắc mắc học hỏi được cái gì? mình cũng thắc mắc y thế khi thấy các repo khác mentioned tên mình và tên project của mình, chắc họ nhìn vào mình như là một case điển hình của code thối và kiến trúc tồi .
Về sau thì mình mới biết lý do project của mình còn sót lại là vì “người ta” không coi mình là đối thủ https://news.ycombinator.com/item?id=9976643. Thêm một bài học nữa, ở hiền thì gặp lành, chỉ cần mình đừng làm hại đến người ta, thì dù có tiền, người ta cũng sẽ để yên cho mình.
Vấn đề kiểm soát dự án
Tất nhiên không phải bài học miễn phí nào cũng dễ chịu, bên cạnh những người bạn vô danh sẵng lòng đem kiến thức của họ ra mở mang tầm mắt cho mình một cách nhiệt tình và nhã nhặn, có không ít những cá nhân thoải mái mạt sát, chửi đổng khi gặp những điều họ không vừa ý về project, hoặc lên các diễn đàn, website khác để nói xấu, cũng có vô số người tạo issue xong lặn đâu mất, 2, 3 năm sau mới vô comment lại
Tuy khó chịu thật, đôi lúc đọc issue xong chán chả buồn comment, nhưng nghĩ lại thì qua mỗi một trường hợp như thế, mình đều học được thêm về cách deal với từng loại người khác nhau trên internet, và quan trọng hơn nữa, đây là công sức và cống hiến của mình cho cộng đồng, ở đâu đó, dự án của mình đã ít nhiều tạo được một chút impact tốt đẹp (ví dụ như trường hợp anh thầy giáo Brazil ở trên), mình lấy đó làm động lực để tiếp tục fix bug
Nếu mà nói về một bài học đắt giá nhất, thì có lẽ đó là bài học về cách để kiểm soát dự án một cách hiệu quả.
Hồi đầu khi project vừa được ra mắt, mình rất là ba phải, ai tạo issue gì hay suggest cái gì mình cũng đều accept, gần như là merge hết không chừa một cái PR nào (thằng bé lần đầu được nhiều người tặng star và contribue cho dự án, nên gặp ai cho cái gì cũng hốt).
Và hậu quả thì chỉ sau vài tháng, toàn bộ codebase đã trở nên hoàn toàn lạ lẫm đối với mình , đến mức chính bản thân mình còn không hiểu được code nữa, còn thời gian dành cho việc fix bug do user report còn nhiều hơn cả thời gian làm việc ở công ty. Mặc dù đến lúc đó đã có thêm 2 bạn contributor khác cũng join vào để maintain dự án. Danh sách issue thì ngày một dài lên.
Nếu ở thời điểm đó mình biết cách nói không với các feature request, hay giữ thái độ cứng rắn hơn khi nhận được các pull request, biết cách sắp xếp và quản lý được roadmap cho dự án hiệu quả hơn thì có lẽ mình sẽ không bị quá tải và dẫn đến việc chán nản mà bỏ luôn dự án.
Tại sao lại bỏ?
Vì sao mình không làm tiếp dự án này?
Mặc dù những ai biết mình thì đều biết rằng mình nổi tiếng với việc làm giữa chừng là bỏ, nhưng nói thật là trong dự án này mình có lý do hẳn hoi đấy nhé.
Đầu tiên, phải nói đến đó là vision và motivation khi bắt đầu dự án. Mình hoàn toàn không có một định hướng gì rõ ràng cho dự án này, và mình bắt đầu làm nó chỉ vì rảnh quá không biết dùng thời gian để làm gì.
Và mình chỉ trở nên nghiêm túc với nó sau khi nhận được một vài sự chú ý nhất định.
Cho nên khi số lượng issue và feature request tăng lên, các vấn đề khó hơn xuất hiện càng nhiều, không còn quá quen thuộc với chính dự án do mình khởi xướng lên từ đầu, nên thời gian để fix bug cũng tăng lên, mức độ interest của mình đối với dự án càng lúc càng đi xuống.
Một lý do khác nữa, là mình không thực sự cảm thấy tự hào về dự án này, nhiều star để làm gì? trong khi bản thân dự án có kiến trúc cực kì non nớt, performance cực kì kém và các kĩ thuật sử dụng trong dự án cũng cực kì lởm. Điểm sáng duy nhất có lẽ là project rất đơn giản và đi kèm với nó là tài liệu mô tả khá chi tiết.
Những vấn đề còn bỏ ngỏ
Vẫn còn rất nhiều những vấn đề quan trọng mà mình chưa có cơ hội / và không còn hứng thú để giải quyết trong dự án này, roadmap còn rất nhiều những task chưa được tick, nhưng có lẽ một trong những vấn đề lớn nhất đó là performance khi có nhiều người cùng chơi – có rất nhiều lý do đằng sau chuyện này, phần lớn là từ phía xử lý logic game trên server, từ việc sử dụng JSON để xử lý tín hiệu trong game,…
Có lẽ một lúc nào đó mình sẽ viết lại hoàn toàn game này, hoặc cũng có thể là mình sẽ sửa sai bằng một project hoàn toàn mới không biết chừng (rồi cũng sẽ bị drop thôi ).
Dù sao thì đây cũng là một project thú vị, và hành trình đưa nó đến với cộng đồng cũng đã đem lại cho mình rất nhiều kinh nghiệm và bài học quý giá. Và tất nhiên đây không phải là trải nghiệm duy nhất của mình, còn rất nhiều những dự án khác nữa mà mình sẽ kể trong các bài viết tới, mong các bạn đón đọc.
Điều đầu tiên, cho dù bạn nghĩ thế nào đi nữa thì chắc chắn sẽ không có chuyện 1 bước lên mây, bạn không thể hi vọng có thể áp dụng 1 kiến trúc cho tất cả các vấn đề gặp phải dù cho kiến trúc đó có good cỡ nào, một đôi giày triệu $ chắc gì đã làm bạn thấy thoải mái và vừa vặn. Hãy học hỏi thật nhiều các cách tiếp cận khác nhau, ưu nhược của từng cái, vấn đề mà nó giải quyết. Hãy chắc chắn là bạn hiểu rõ dự án của bạn cần gì, hiểu rõ kiến thức nghiệp vụ và yêu cầu của khách hàng, từ đó sẽ đi đến việc quyết định lựa chọn / tùy chỉnh mô hình nào phù hợp nhất.
Rõ ràng là không dễ để những người trẻ tuổi, có ít hoặc không có kinh nghiệm trong việc chọn lựa mô hình kiến trúc nào phù hợp với yêu cầu của dự án. Bằng cách tham khảo các dự án đi trước, tham vấn ý kiến, kinh nghiệm từ những người dày dặn cộng với kiến thức đã học được về kiến trúc phần mềm sẽ giúp bạn đỡ bối rối hơn khi giải quyết các vấn đề ở mức vĩ mô hơn.
Trong kỹ nghệ phần mềm có hàng trăm các thuật ngữ nhập nhằng, mơ hồ được đưa ra khiến cho việc sử dụng và hiểu biết của chúng ta bị nhầm lẫn thậm chí hiểu sai. Cùng làm rõ 1 số thuật ngữ chuyên dùng nhất ở phía dưới đây (tôi dùng nguyên bản tiếng Anh cho tiện refer về sau):
FUNCTIONAL
Là những đơn vị code (dòng code, method, class hoặc nhóm các class) đề cập đến khía cạnh kỹ thuật của ứng dụng. Functional không liên quan đến nghiệp vụ. Ví dụ một số functional thường gặp: Layers Factories Repositories Value Objects Views ViewModels ConceptualLà những đơn vị code phản ánh các khái niệm nghiệp vụ của ứng dụng, ví dụ như: User Product Checkout Post Comment Review Một điểm lưu ý là một đơn vị code có thể đảm nhận luôn 2 chức năng là Functional và Conceptual. Ví dụ như class “Money” vừa có thể thể hiện như 1 domain concept hoặc có thể coi như là 1 Value Object. (không có ID, có thể immutable,…)
PACKAGE
Tập các class được group lại với nhau theo 1 số rule.
MODULE
Theo định nghĩa từ cuốn Software Architecture in Practice thì một module là 1 functional package, nó phản án 1 technical capability (tính năng kỹ thuật) trong ứng dụng. Các module có tính độc lập (decoupled) và một module có thể được thay thế bởi một module khác mà ứng dụng vẫn có thể hoạt động. Ví dụ ta có 1 “Security Module” hoặc “ORM”, hoặc cao hơn nữa, ta có thể xem Client và Server là 2 module của ứng dụng. Module tạo ra tính gắn kết về mặt chức năng kỹ thuật (Functional cohesion) nghĩa là tập các đơn vị code làm chung một Functional sẽ được đóng gói vào một module.
COMPONENT
Ngược lại với Module, theo định nghĩa từ cuốn Software Architecture in Practice thì một Component là một conceptual package, nó phản ánh một business capability (tính năng về nghiệp vụ). Và tất nhiên nó cũng có tính độc lập với các component và module khác. Ví dụ ta có User component, Product component, Checkout component.Một chú ý rất quan trọng đó là component phản ánh 1 bounded context, nó cung cấp tính gắn kết về mặt chức năng nghiệp vụ.Lưu ý: bounded context là thuật ngữ dùng trong Domain Driven Design, đề cập đến việc phân rã nghiệp vụ thành các nghiệp vụ đơn lẻ, nhỏ hơn mà vẫn đảm bảo ý nghĩa của nó trong toàn bộ hệ thống, khi đó bounded context được xem như là cái bao trùm và diễn tả cho nghiệp vụ đó.
APPLICATION
Tác giả xem application là UI – user-facing code, cái được build phía trên cùng và sử dụng các nền tảng nghiệp vụ phía dưới (components). Lấy ví dụ về Web shop, chúng ta có 1 tập các component về nghiệp vụ của 1 web shop. Chúng ta cũng có 2 là trang bán hàng (storefront) cung cấp các UI đến khác hàng và trang admin dùng để quản lý nội bộ. Trang bán hàng và admin có thể coi đó như 2 application sử dụng các nền tảng nghiệp vụ phía dưới.
SYSTEM
System là một tập các applications làm việc, tương tác cùng với nhau nhằm phục vụ các nhu cầu của một doanh nghiệp, tổ chức, hay còn được gọi với cái tên mỹ miều hơn: Enterprise Application. Các application trong 1 system có thể hoặc không xây dựng dựa trên cùng một nền tảng nghiệp vụ. Cũng ví dụ về web shop, trang bán hàng và trang admin phụ thuộc vào các nghiệp vụ bán hàng, tuy nhiên bên cạnh đó còn có các application bên thứ 3 khác liên kết trong hệ thống của mình đó là dịch vụ thanh toán, hoặc dịch vụ vận chuyển.
Động não: REST API có phải là 1 application? Các dịch vụ thanh toán, vận chuyển trong ví dụ trên nếu không có UI thì có thể được gọi là application hay không? Liệu bạn có muốn thay đổi định nghĩa về 1 application hay không?
Theo wikipedia thì kiến trúc phần mềm của một chương trình máy tính hay một hệ thống tính toán là cấu trúc của các thành phần trong hệ thống đó. Kiến trúc phần mềm bao gồm các phần tử phần mềm, các thuộc tính và mối quan hệ giữa chúng. Ngoài ra, thuật ngữ “kiến trúc phần mềm” cũng đề cập đến các tài liệu kiến trúc phần mềm của một hệ thống, thuận tiện cho việc trao đổi thông tin giữa các thành viên trong một dự án. Kiến trúc phần mềm giúp việc quyết định ở mức cao trong thiết kế phần mềm dễ dàng hơn và cho phép tái sử dụng các thành phần và mẫu thiết kế của các dự án.
Ngoài ra còn có rất nhiều định nghĩa về Software Architecture, tuy nhiên tôi lại thích cách diễn đạt về Architecture bằng cách nói về két quả đầu ra của Architecture
Khi nói về Architecture, điều đó có nghĩa là:
Tất cả các quyết định kỹ thuật xuyên suốt tất cả các vấn đề phát triển phần mềm. Ví dụ như: frameworks, coding standards, documentation, process, …;
Những quyết định về mặt kỹ thuật rất khó thay đổi về sau trong dự án Big picture (cái view tổng thể) của cả system.
Những bản vẽ tổng quan ban đầu về hình hài của system, cấu trúc và mối liên hệ giữa các components
Nó chuẩn bị cho dự án sao cho có thể trì hoãn các quyết định (về framework, view, db, …) càng lâu càng tốt.
Nó chuẩn bị cho dự án để tái sử dụng các thành phần và mô-đun
Nó thiết lập các chuẩn trong việc nhất quán về mặt kết quả và Nó không phải là trách nhiệm của chỉ một người, mà là của một nhóm các nhà phát triển giàu kinh nghiệm thuộc các nhóm đặc trưng khác nhau trong dự án.
ARCHITECT
Về cơ bản, kiến trúc sư phần mềm chịu trách nhiệm cho thiết kế hệ thống phần mềm và đảm bảo rằng nó đáp ứng các yêu cầu của doanh nghiệp cũng như yêu cầu hệ thống của kết cấu nền của công ti. Kĩ năng đặc biệt này yêu cầu nhiều năm kinh nghiệm phát triển phần mềm trong các nền, ngôn ngữ và công nghệ nào đó. Trước khi thiết kế hệ thống, kiến trúc sư phần mềm phải làm việc chặt chẽ với kĩ sư yêu cầu hay người phân tích doanh nghiệp để hiểu các yêu cầu của khách hàng rồi hỗ trợ cho người quản lí dự án phát triển kế hoạch dự án nơi việc chia các yêu cầu thành những nhiệm vụ nhỏ hơn là mấu chốt.
SMELLS OF A BAD ARCHITECTURE (AND BAD CODE)
RIGIDITY (CỨNG NHẮC)
Phần mềm được gọi là cứng nhắc khi nó rất khó thay đổi vì thay đổi này sẽ dẫn đến những thay đổi khác mà không thấy điểm dừng.
FRAGILITY (DỄ VỠ)
Một phần mềm dễ vỡ là khi chỉ một thay đổi nhỏ cũng có thể dẫn đến những behavior không mong muốn và không thể dự đoán.
Immobility (không có tính di động)Một thiết kế không có tính di động (tái sử dụng) là khi nó không thể tách ra hoặc tốn quá nhiều effort để tái sử dụng cho nhiều thành phần khác nhau.
VISCOSITY (LÕNG LẼO)
Trong một hệ thống lõng lẽo là hệ thống dễ dàng để làm sai hơn là làm đúng. Nghĩa là khi ta muốn thực hiện một thay đổi, thay vì làm theo quy định trong thiết kế, ta lại đi “đường tắt” để làm việc đó. Điều đáng nói ở đây không phải là việc ta được đi đường tắt, mà bản thân thiết kế đã không có những ràng buộc chắc chắn để không ai có thể vi phạm và phá vỡ cấu trúc của hệ thống.
Điều này xảy ra khi các khái niệm trừu tượng (abstraction) cần thiết không được thực hiện, hoặc là do thiếu thời gian hoặc thiếu kinh nghiệm. Mã có thể đã không được dán sao chép nhưng các quy tắc kinh doanh tương tự được định nghĩa ở nhiều nơi.
OPACITY (KHÔNG RÕ RÀNG)
Mã đã được viết bằng một cách mờ đục và khó hiểu, và chúng ta cần phải nhảy vào từng method để hiểu những gì đang làm.
NEEDLESS COMPLEXITY (PHỨC TẠP KHÔNG CẦN THIẾT)
Việc tạo ra các khái niệm trừu tượng là rất cần thiết để có thể dễ dàng thay đổi và mở rộng trong tương lai, tuy nhiên trong 1 số nỗ lực để tránh các smell ở trên thì các nhà thiết kế có thể sẽ rơi vào bẫy phức tạp hóa vấn đề. Thiết kế phần mềm tốt nhẹ, linh hoạt, dễ đọc và dễ hiểu và trên hết là dễ thay đổi, tuy nhiên bạn không phải cố gắng dự đoán tất cả những thay đổi có thể xảy ra trong tương lai.
Đây là bài viết trong loạt bài viết về “Tổng quan về sự phát triển của kiến trúc phần mềm“. Đây là loạt bài viết chủ yếu giới thiệu về một số mô hình kiến trúc phần mềm hay nói đúng hơn là sự phát triển của chúng qua từng giai đoạn, qua đó giúp chúng ta có cái nhìn tổng quát, up-to-date và là roadmap để bắt đầu hành trình chinh phục (đào sâu) thế giới của những bản thiết kế với vai trò là những kỹ sư và kiến trúc sư phần mềm đam mê với nghề.
Thời gian gần đây NoSQL nổi lên như là một loại hình cơ sở dữ liệu mới. Hỗ trợ đầy đủ, hiệu năng không thua kém cấu trúc SQL truyền thống. Tuy nhiên, điểm mạnh NoSQL thực sự nằm ở đâu, điều gì làm NoSQL trở thành lựa chọn tuyệt vời trong một số trường hợp?
Bài viết dưới đây cung cấp cho anh em cái nhìn tổng quan NoSQL là gì, trường hợp nào nên sử dụng, khi nào không, tất tần tật sẽ được giải đáp.
Hiểu điểm mạnh NoSQL để đỡ phải lăn tăn sau này
NoSQL là gì?
NoSQL (Not only SQL) là một loại cơ sở dữ liệu không quan hệ (non-relational database), được xây dựng dành riêng cho mô hình dữ liệu có sơ đồ linh hoạt để xây dựng các ứng dụng hiện đại (như document-oriented, key-value, column-family, graph,…).
Cơ sở dữ liệu NoSQL được công nhận rộng rãi vì tính dễ phát triển, có khả năng mở rộng theo chiều ngang (horizontal scaling) để xử lý lượng dữ liệu lớn, mở rộng chức năng cũng như hiệu năng ở quy mô lớn.
Cần lưu ý rằng NoSQL tỏ ra vượt trội hơn về khả năng dễ phát triển và tính linh hoạt.
8 tính năng chính của NoSQL
Sơ đồ động (Dynamic schema): Cơ sở dữ liệu NoSQL không có sơ đồ cố định và có thể điều chỉnh các cấu trúc dữ liệu đang thay đổi mà không cần di chuyển hoặc thay đổi sơ đồ.
Khả năng mở rộng ngang (Horizontal scalability): Cơ sở dữ liệu NoSQL được thiết kế để mở rộng ra bằng cách thêm nhiều nút vào một cụm cơ sở dữ liệu, làm cho chúng phù hợp để xử lý lượng lớn dữ liệu và mức độ lưu lượng truy cập cao.
Dựa trên tài liệu (Document-based): Một số cơ sở dữ liệu NoSQL, chẳng hạn như MongoDB, sử dụng một mô hình dữ liệu dựa trên tài liệu, trong đó dữ liệu được lưu trữ ở định dạng bán cấu trúc không có sơ đồ, chẳng hạn như JSON hoặc BSON.
Dựa trên khóa-giá trị (Key-value-based): Một số cơ sở dữ liệu NoSQL khác, chẳng hạn như Redis, sử dụng một mô hình dữ liệu dựa trên khóa-giá trị, trong đó dữ liệu được lưu trữ dưới dạng một bộ sưu tập các cặp khóa-giá trị.
Dựa trên cột (Column-based): Một số cơ sở dữ liệu NoSQL, chẳng hạn như Cassandra, sử dụng một mô hình dữ liệu dựa trên cột, trong đó dữ liệu được tổ chức thành các cột thay vì các hàng.
Phân tán và khả năng sẵn sàng cao (Distributed and high availability): Cơ sở dữ liệu NoSQL thường được thiết kế để có sẵn cao và tự động xử lý lỗi nút và sao chép dữ liệu trên nhiều nút trong một cụm cơ sở dữ liệu.
Tính linh hoạt (Flexibility): Cơ sở dữ liệu NoSQL cho phép các nhà phát triển lưu trữ và truy xuất dữ liệu một cách linh hoạt và động, với hỗ trợ cho nhiều loại dữ liệu và các cấu trúc dữ liệu đang thay đổi.
Hiệu suất (Performance): Cơ sở dữ liệu NoSQL được tối ưu hóa cho hiệu suất cao và có thể xử lý một khối lượng lớn các thao tác đọc và ghi, làm cho chúng phù hợp cho dữ liệu lớn và các ứng dụng thời gian thực.
NoSQL có khả năng mở rộng theo chiều ngang (horizontal scaling) một cách dễ dàng bằng cách thêm máy chủ, cho phép xử lý lượng dữ liệu lớn. Điều này rất hữu ích trong các ứng dụng có lưu lượng dữ liệu lớn và không đồng nhất.
Hiệu suất (Performance)
NoSQL thường có hiệu suất cao hơn so với SQL khi xử lý dữ liệu lớn và phi cấu trúc. Các cơ sở dữ liệu NoSQL thường sử dụng các cấu trúc dữ liệu tối ưu hóa cho các truy vấn cụ thể.
Linh hoạt (Flexibility)
Các mô hình dữ liệu của NoSQL (document-oriented, key-value, etc.) cho phép lưu trữ dữ liệu phi cấu trúc một cách dễ dàng. Không cần phải định nghĩa sơ đồ dữ liệu trước khi lưu trữ dữ liệu, cho phép dễ dàng thay đổi và phát triển.
Khả năng sẵn sàng (Availability)
Nhiều cơ sở dữ liệu NoSQL được thiết kế để có tính sẵn sàng cao, cho phép duy trì hoạt động ngay cả khi có sự cố. Điều này được đạt được thông qua việc phân phối dữ liệu trên nhiều máy chủ.
Tính đa dạng (Diversity)
NoSQL cung cấp nhiều mô hình dữ liệu khác nhau như document-oriented, key-value, column-family, graph, etc. Điều này cho phép chọn mô hình phù hợp nhất với từng ứng dụng cụ thể.
Chi phí thấp (Cost-effectiveness)
Cơ sở dữ liệu NoSQL thường tiết kiệm chi phí hơn so với cơ sở dữ liệu quan hệ truyền thống vì chúng thường ít phức tạp hơn và không yêu cầu phần cứng hoặc phần mềm đắt tiền.
Nhược điểm của NoSQL
Thiếu chuẩn hóa: Có nhiều loại cơ sở dữ liệu NoSQL khác nhau, mỗi loại đều có điểm mạnh và điểm yếu riêng. Điều này có thể làm cho việc lựa chọn cơ sở dữ liệu phù hợp cho một ứng dụng cụ thể trở nên khó khăn.
Các cơ sở dữ liệu NoSQL không đảm bảo hoàn toàn tính ACID (Atomicity, Consistency, Isolation, Durability). Điều này có thể là hạn chế đối với các ứng dụng yêu cầu đảm bảo tính nhất quán và toàn vẹn của dữ liệu.
Quản lý dữ liệu lớn trong NoSQL phức tạp hơn so với cơ sở dữ liệu quan hệ.
Một số NoSQL lưu trữ dữ liệu dưới dạng JSON, khiến kích thước tài liệu trở nên lớn.
Key-value là loại cấu trúc thường được sử dụng nhất trong các Hệ CSDL NoSQL.
This model is also the fastest way to get data by known key, but without the flexibility of more advanced querying.
Model này là cách nhanh chóng để lấy dữ liệu bằng cách cung cấp key. Tránh được việc phải viết thêm nhiều query để collect data
Hình dưới đây là Key-value được lưu trữ trong collection ở Firebase. Với một key (được Firebase định danh duy nhất), ta có thể lấy ra tất cả field được store với key này.
Điểm mạnh NoSQL chính là ở chỗ này, một key có thể lấy ra nhiều value, số lượng item trong value cũng flexible, có thể tùy biến được.
It may be used for data sharing between application instances like distributed cache or to store user session data.
Ngoài, sử dụng Key-value còn hữu ích nếu muốn chia sẻ giữa các application trong hệ thống distributed cache hoặc lưu giữa user session data.
Document Stores
Ngoại trừ Key-value sử dụng phổ biến, NoSQL cũng hỗ trợ Document Stores
Document store is a data model for storing semi-structured document object data and metadata. The JSON format is normally used to represent such objects.
Document store là loại lưu trữ bán cấu trúc, gồm các đối tượng dữ liệu và siêu dữ liệu. Thông thường kiểu JSON được sử dụng để lưu trữ kiểu này
Thay vì tạo các column lưu trữ VARCHAR, CHAR rồi store JSON. Một số platform hỗ trợ lưu trữ các object JSON, dễ dàng để store và collect hơn. Đây là điểm mạnh NoSQL có được, vượt lên so với các hệ cơ sở dữ liệu SQL truyền thống.
Column-Oriented Stores
Lưu trữ hướng về cột (Column Oriented Stores) gần giống như relations ship giữa các primary key bên phía SQL.
It is similar to a relational database index, however a column family may be an arbitrary collection of columns.
Gần giống như quan hệ giữa database index, tuy nhiên một họ cột có thể là một tập hợp các cột tùy ý.
Ngoài ra:
This particular approach is used for very large scalable databases to greatly reduce time for searching data. It is rarely used outside of enterprise level applications.
Cách tiếp cận cụ thể này được sử dụng cho các cơ sở dữ liệu có khả năng mở rộng. Giúp giảm đáng kể thời gian tìm kiếm dữ liệu. Loại này thường được sử dụng cho các application ở cấp doanh nghiệp.
Graph stores
Mô hình dữ liệu Graph Database được lưu trữ dưới dạng các nút (nodes), các mối quan hệ (edges) và các thuộc tính (properties). Các nút có thể là bất kỳ đối tượng, địa điểm hoặc cá nhân nào.
Các mối quan hệ (edges) định nghĩa các mối liên kết giữa các nút.
Graph Databases rất thích hợp cho việc lưu trữ và quản lý mạng lưới các mối kết nối giữa các thực thể trong dữ liệu như mạng xã hội, hệ thống khuyến nghị, phát hiện gian lận, quản lý quan hệ khách hàng, v.v.
Ví dụ về Graph Database: Neo4j là một ví dụ về Graph Database, được xây dựng trên nền tảng Java với cộng đồng mã nguồn mở. Neo4j cung cấp cả phiên bản miễn phí (community edition) và các bản có license để sử dụng các tính năng nâng cao như sao lưu và tính sẵn sàng cao.
NoSQL vs SQL
SQL hay NoSQL sẽ phù hợp hơn cho dự án của bạn? Cùng điểm qua một vài so sánh cơ bản về hai loại database này trong bảng dưới đây:
Tiêu chí
NoSQL
SQL
Mô hình dữ liệu
Dữ liệu được lưu trữ dưới dạng tài liệu, bảng, đồ thị, column-family, hoặc cấu trúc dữ liệu khác.
Dữ liệu được lưu trữ dưới dạng các bảng với hàng và cột.
Cấu trúc dữ liệu
Linh hoạt, không cần theo một cấu trúc cứng nhắc.
Cấu trúc cứng nhắc, đòi hỏi định nghĩa bảng và các ràng buộc trước khi lưu trữ dữ liệu.
Quan hệ dữ liệu
Không có quan hệ chuẩn như trong SQL, thường sử dụng denormalization.
Quan hệ giữa các bảng được định nghĩa rõ ràng bằng các khóa chính và khóa ngoại.
Tính mở rộng
Mở rộng theo chiều ngang (scale-out) bằng cách thêm nút vào hệ thống.
Mở rộng theo chiều dọc (scale-up) bằng cách nâng cấp phần cứng.
Sử dụng
Phù hợp với dữ liệu có cấu trúc không chuẩn và yêu cầu tính mở rộng cao.
Phù hợp với dữ liệu có cấu trúc chuẩn và yêu cầu tính nhất quán cao.
Ví dụ
MongoDB, Cassandra, Redis, Couchbase.
MySQL, PostgreSQL, Oracle, SQL Server.
Nên sử dụng NoSQL trong trường hợp nào?
Khi cấu trúc dữ liệu chưa hoàn chỉnh
Thực tế, thời gian cho vòng đời một phần mềm (Software) đang ngày càng rút ngắn. Không thể cứng nhắc là phải có Database Structure rõ ràng mới bắt đầu phát triển phần mềm. Tùy vào đặc thù của từng dự án để linh động trong giải quyết vấn đề.
Hiện tại, nếu table A được định nghĩa 4 column (4 field). Nhưng trong quá trình phát triển, nếu ta cần thêm 2 field nữa, sự khác biệt sẽ nhận thấy rõ ngay giữa SQL và NoSQL
Nếu sử dụng SQL (Structure), có cấu trúc. Tất nhiên sẽ phải ALTER table đó, hoặc là tầm nhìn xa hơn sẽ dùng column store Json. Thay đổi Json Store. Việc này tuy có thể đáp ứng nhưng khá phức tạp.
Nếu sử dụng NoSQL, do không quá ràng buộc về mặt cấu trúc, ta vẫn có thể thoải mái store node đó với 4 field, trong khi những node trước đó là 2 field.
NoSQL là lựa chọn lý tưởng cho dữ liệu không được tổ chức thành cấu trúc hoặc có cấu trúc chưa hoàn chỉnh
Rõ ràng, khi ứng dụng chưa thực sự rõ ràng về cấu trúc dữ liệu (có thể do requirement từ khác hàng, các feature hoặc bug chưa tìm thấy). NoSQL là lựa chọn tốt hơn so với SQL truyền thống
Rõ ràng mà nói điểm mạnh NoSQL là tốt cho các ứng dụng có cấu trúc CSDL chưa hoàn chỉnh, đang hoặc sẽ được điều chỉnh trong quá trình sử dụng.
Xử lí Dữ liệu lớn (Big Data)
Với khả năng xử lý lượng dữ liệu khổng lồ, NoSQL là lựa chọn lý tưởng cho các hệ thống cần phân tích dữ liệu quy mô lớn, như các ứng dụng phân tích dữ liệu, Internet of Things (IoT), và các nền tảng truyền thông xã hội.
Các cơ sở dữ liệu như MongoDB, Cassandra, Couchbase rất phù hợp với các ứng dụng Big Data.
Cần khả năng mở rộng liên tục
Khi dữ liệu thay đổi liên tục và không có cấu trúc rõ ràng, NoSQL có thể phù hợp hơn.
Khi dữ liệu liên tục tăng lên và cần mở rộng cơ sở dữ liệu thường xuyên, NoSQL có thể cung cấp khả năng mở rộng tốt hơn.
Không cần quan hệ giữa dữ liệu
Nếu mối quan hệ giữa các dữ liệu không quan trọng, không yêu cầu các ràng buộc và kết nối phức tạp cấp độ database bạn có thể chọn NoSQL, ngược lại nên chọn RDBMS.
Tóm lại, NoSQL hay SQL đều có những ưu và nhược điểm riêng, với những phân tích trên, hi vọng bạn đã hiểu NoSQL database là gì và khi nào cần sử dụng cơ sở dữ liệu SQL. Theo dõi TopDev để cập nhật thêm nhiều kiến thức công nghệ!
Tôi sống và làm việc hàng ngày trong một căn hộ thuê ở tầng hầm với mức giá 600 đô/tháng. Mong muốn tìm cho bản thân một công việc tốt ở những môi trường chuyên nghiệp luôn hiện hữu trong tôi. Và Twitter là một trong những nơi tôi hướng đến với suy nghĩ như thế. Tôi cũng hiểu rõ là để bắt đầu cuộc hành trình chinh phục giấc mơ này, trước tiên mình cần chăm chút hơn cho CV IT tiếng Anh của mình.
Năng lực chuyên môn
Về background của mình, tôi tốt nghiệp với tấm bằng cử nhân về khoa học máy tính và nộp đơn xin việc vào 30 công ty khác nhau, được phỏng vấn với 15 công ty, bị từ chối bởi 6 trong số đó. Tôi hiểu rằng để nhận được offer của các công ty tốt, một chiếc CV English IT là rất cần thiết. Vậy nên tôi dành nhiều thời gian để đầu tư hơn cho CV của mình. Cuối cùng tôi nhận việc tại một công ty startup và có 3 năm làm việc với tư cách một Full stack Engineer. Công việc chính của tôi là build microservices cũng như phát triển API trên AWS stack. Đây là công việc đầu tiên của tôi, trước đây tôi chưa hề có kinh nghiệm làm việc hay thực tập ở bất kì vị trí nào khác cả.
Thể hiện năng lực trong CV là cách chinh phục nhà tuyển dụng
Làm sao tôi đến được Twitter với CV IT tiếng Anh của mình?
Trước đây tôi đã từng ứng tuyển vào Twitter nhưng không thành công. Một phần là vì tôi chưa có nhiều kinh nghiệm xin việc (như đã chia sẻ ở trên) nên cũng không biết cách để CV IT tiếng Anh của mình được đánh giá cao hơn. Vì thế ở lần thứ hai này, tôi may mắn nhận email từ phòng tuyển dụng của họ với đề nghị sắp xếp một cuộc phỏng vấn qua điện thoại với các kỹ sư của họ. Họ cũng gửi cho tôi một sheet tổng hợp toàn diện những kiến thức liên quan đến việc luyện tập và nâng cao kỹ năng coding cũng như xây dựng thuật toán.
Trong tài liệu có đề cập đến việc sử dụng Leetcode cho việc luyện tập. Tôi dành hàng giờ mỗi ngày để luyện coding và chuẩn bị tốt nhất cho vòng phỏng vấn sắp tới. Những cuộc phỏng vấn liên quan đến chuyên môn thật sự không hề dễ dàng, nhất với một người đã tốt nghiệp được một khoảng thời gian như tôi. Tôi phải dành nhiều thời gian để trau dồi thêm kỹ năng và nguyên tắc cần thiết khác để ứng tuyển thành công.
Twitter đã nhấn mạnh cuộc phỏng vấn này sẽ tập trung vào những kiến thức chuyên môn liên quan tới map, cây nhị phân, danh sách liên kết, đồ thị,… Vậy nên thậm chí tôi còn tham gia khóa huấn luyện cá nhân Acing The Technical Interview để chuẩn bị tốt nhất.
Cách tôi nộp CV IT tiếng Anh và chuẩn bị cho một cuộc phỏng vấn
Tôi tìm được công việc này thông qua LinkedIn. Đây là một trong những nền tảng giúp bạn dễ dàng tìm được nhiều công việc hấp dẫn vì nó được các nhà tuyển dụng sử dụng rất nhiều. Tôi đăng tải CV IT tiếng Anh của mình trên tài khoản cá nhân để các nhà tuyển dụng dễ quan sát và tìm kiếm. Và kể từ khi nhận được thông báo phỏng vấn, tôi có 1 tháng làm việc và học tập liên tục để chuẩn bị cho cuộc phỏng vấn này.
Đầu tiên, tôi được giao cho các tài liệu liên quan đến coding trên Google Tài liệu. Chúng tôi bàn về cách phân tích và tiếp cận các dữ liệu này, tôi có 30 phút để phân tích với nhà tuyển dụng. Những kinh nghiệm và chuyên môn được đề cập trong CV IT tiếng Anh là một phần để nhà tuyển dụng tham khảo và đặt ra câu hỏi phỏng vấn ứng viên. Sau hai vòng đầu tiên, tôi được chuyển tiếp đến vòng phỏng vấn tại chỗ tiếp theo tại Twitter Seattle.
Sau đó, họ gửi cho tôi một liên kết đến kho mã hóa trực tuyến và yêu cầu tôi đánh giá code. Tôi cần đưa ra đề xuất về cách cải thiện code và thảo luận với người phỏng vấn trực tiếp. Có một điều bạn cần lưu ý trong các cuộc phỏng trực tiếp tại Twitter là mỗi vòng sẽ có 2 người phỏng vấn bạn.
Thiết kế hệ thống
Các vấn đề xoay quanh nội dung này liên quan đến việc thiết kế một hệ thống từ đầu, mục đích là kiểm tra xem giới hạn thật sự của ứng viên có thể đạt đến đâu. Một trong những câu hỏi mà tôi được hỏi là “Bạn có thể xây dựng một hệ thống đáng tin cậy với thời gian ngừng hoạt động hợp lý từ đầu đến cuối, từ thiết lập giao diện người dùng đến giao tiếp thông qua API HTTP, xây dựng dịch vụ phụ trợ không?”…
Chuyên môn – phần quan trọng của CV IT tiếng Anh
Các vấn đề xung quanh cuộc phỏng vấn đều xoay quanh chuyên môn và kỹ năng thật sự của bạn. Các câu hỏi sẽ đi sâu vào từng khía cạnh của vấn đề như “Dự án bạn đã xây dựng gần đây là gì? Tại sao bạn lại xây dựng nó? Những lựa chọn thay thế được xem xét là gì? Cuối cùng thì nó có hoạt động không?” Vòng này không có các câu hỏi mã hóa mà sẽ tập trung năng lực của bạn trong xử lý từng chi tiết nhỏ của dự án.
Văn hóa làm việc
Nếu được vào đến vòng này, nghĩa là bạn đã làm tốt trong 2 vòng phỏng vấn trước, và ở vòng này họ đang tìm kiếm một người có văn hóa làm việc phù hợp với văn hóa doanh nghiệp. Bạn sẽ được nói chuyện với Giám đốc tuyển dụng và chuyên viên cấp cao trong công ty. Mọi hành động và lời nói của bạn sẽ được đánh giá một cách khắt khe nhất để đảm bảo tìm được ứng viên phù hợp.
Mỗi môi trường làm việc chuyên nghiệp đều đòi hỏi ứng viên cần có tính cách hoặc cách ứng xử phù hợp. Mỗi nhân viên là thành phần gắn kết và có ảnh hưởng đến công ty. Chính vì thế khi tuyển dụng họ đều chú ý đến vấn đề này. Gear Inc. là một ví dụ điển hình.
Kết luận
Đa phần việc tuyển dụng tại các doanh nghiệp lớn như Twitter đều đòi hỏi người ứng tuyển có chuyên môn cao và năng lực ứng xử tốt. Do đó, bạn hãy cố gắng trau dồi, cải thiện những khả năng này của mình để có được công việc mình mong muốn nhé.
IronPython là một triển khai của Python chạy trên .NET Framework, cho phép bạn kết hợp sức mạnh của Python với các tính năng của .NET. Dưới đây là hướng dẫn chi tiết cách sử dụng IronPython với .NET Framework
Assembly là gì?
Assembly (số nhiều: assemblies) là một file được tạo ra bởi quá trình compile một ứng dụng .NET. Nó có thể có đuôi .dll hoặc .exe. .NET Framework có sẵn rất nhiều assemblies (chính là thành phần Class Library trong .NET Framework), cũng tương tự như Python có sẵn rất nhiều standard libraries vậy.
AddReference .NET Assemblies
Khi lập trình các ngôn ngữ .NET khác như C# hay VB.NET, dùng Visual Studio, muốn sử dụng các công cụ trong .NET Framework thì bạn phải thêm “Reference” vào project browser. IronPython có 1 module hỗ trợ “Add Reference” vào script là clr. Các methods Add Reference trong IronPython:
# Sử dụng một trong các methods sauclr.AddReferenceclr.AddReferenceByNameclr.AddReferenceByPartialNameclr.AddReferenceToFileclr.AddReferenceToFileAndPath
clr.AddReference nhận vào 1 đối tượng System.Reflection.Assembly, hoặc full name của assembly (vd clr.AddReference("System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")), hoặc partial name của assembly (vd clr.AddReference("System.Drawing")). Khi dùng partial name, IronPython sẽ tìm file dll ở trong Global Assembly Cache (GAC). Mình thường dùng cách thứ 3: truyền vào partial name cho ngắn gọn. Xem các assemblies đã add ở clr.References:
Thắc mắc hay gặp: Mình muốn sử dụng 1 công cụ trong .NET Framework thì biết tên assembly là gì để AddReference, biết namespace nào để import? Trả lời với từ khóa tìm kiếm: Tên_công_cụ msdn (VD System Environment msdn). Dùng phần Assembly để AddReference, phần Namespace để import.
Khi chạy ipy.exe, IronPython đã AddReference sẵn tới mscorlib.dll và System.dll [1]. Khi đó chỉ việc import các namespaces có trong 2 assemblies này mà không phải AddRerence.
Ngoài các assemblies có trong .NET Framework, còn có các assemblies khác đi kèm với các phần mềm cài vào Windows, hoặc assemblies được compiled từ chính IronPython. Cú pháp AddReference tương tự như trên, với lưu ý là AddReference khi đó sẽ tìm assemblies trong GAC hoặc sys.path. Nếu không muốn append đường dẫn tới folder chứa file .dll thì có thể dùng AddReferenceToFileAndPath. Phải chạy đúng phiên bản IronPython 32bit/64bit tương ứng với Target Platform mà file assembly được compiled.
Ví dụ file RevitAPI.dll được compiled với Target Platform là x64 (64-bit), nếu chạy ipy.exe (32-bit) sẽ không AddReference được:
AddReference các assemblies được compiled bằng IronPython
Nếu như bạn chưa biết, IronPython có thể compile python script thành các file assemblies (.dll hoặc .exe) sử dụng công cụ kèm theo là pyc.py (sẽ có bài viết riêng về Compile python script dùng IronPython).
Một lưu ý quan trọng khi AddReference các file assemblies này là: phải dùng đúng phiên bản IronPython tương ứng với phiên bản đã dùng để compile ra file assembly đó thì mới AddReference được. Ví dụ: file assembly được compiled bằng IronPython 2.7.3 thì khi AddReference ta phải dùng IronPython 2.7.3. Sẽ có ví dụ cụ thể trong bài Compile python script dùng IronPython.
Bài viết được sự cho phép của tác giả Võ Quang Huy
Slider jquery miễn phí – Trong các website hiện đại slider là 1 phần không thể thiếu, nó giúp trang web của chúng ta chuyên nghiệp hơn, bắt mắt hơn, truyền tải nội dung tới người đọc 1 cách rõ ràng, sinh động hơn…
Để tự code được 1 slider chuyên nghiệp có hiệu ứng đẹp thì thật sự tốn thời gian và không hề đơn giản, vì vậy người ta thường dùng những thư viện slider được cung cấp sẵn để nhúng vào dự án web của họ. Vì thế hôm nay mình sẽ giới thiệu cho các bạn 15 thư viện slider jquery miễn phí, hi vọng sẽ giúp ích cho dự án website của các bạn!
Trên đây là 15 thư viện slider jquery miễn phí khá chất lượng mà mình tìm hiểu được, còn rất nhiều thư viện khác nếu có thời gian các bạn có thể tìm hiểu.
Hi vọng những thư viện này sẽ có ích trong dự án website của các bạn, nếu biết được những thư viện slider jquery nào hay hãy cmt chia sẽ bên dưới nhé!
Firebase là một nền tảng lập trình di động và web application được phát triển bởi Firebase, Inc năm 2011. Vào năm 2014, Firebase được Google mua lại, và đây chính là sự bùng nổ của Firebase khi được một ông lớn công nghệ như Google đứng sau. Tính đến thời điểm tháng 10 năm 2018, Firebase có 18 sản phẩm, chúng được sử dụng bởi 1.5 triệu ứng dụng.
Rất nhanh chóng, sau khi Flutter ra mắt, các plugin hỗ trợ Flutter kết nối với Firebase cũng đã được Google phát triển, họ gọi các plugin đó là FlutterFire. Tuy nhiên, do còn mới các FlutterFire này vẫn chưa chạm đến phiên bản 1.0, đây chính là nguyên nhân gây ra rất nhiều lỗi trong quá trình tích hợp Firebase vào Flutter. Hôm nay mình sẽ hướng dẫn các bạn cách tích hợp Firebase vào Flutter và login với Google. Hãy cùng bắt đầu ngay bây giờ!
Chọn nơi bạn muốn lưu project Flutter của mình, nhấn chuột phải mở git bash, chạy câu lệnh “flutter create <your_project_name>”, mình sẽ đặt tên App là firebase_login. Mình muốn là trên màn hình có hai nút Login, Logout và một dòng chữ thông báo user đã login hay chưa, code của mình như sau:
Sau khi xong phần flutter project, chúng ta sẽ chuyển sang phần Firebase project.
Tạo project Firebase và kết nối với Flutter
Đầu tiên, bạn truy cập Firebase Console, nhấn vào nút Add project. Sau đó đặt tên project, phần Project Id các bạn để mặc định. Ở đây mình đặt project tên là Flutter Firebase, sau đó nhấn Continue để tiếp tục.
Tiếp theo, ở phần Google Analytics for your Firebase project, bạn bỏ tích Enable Google Analytics for this project và nhấn Create project, sau khi tạo xong bạn nhấn Continue để tiếp tục.
Ở trang chủ, bạn nhấn vào biểu tượng Android để thêm ứng dụng Android vào project, ở đây chúng ta sẽ phải nhập applicationId. Bạn mở lại project flutter, vào thư mục “android/app”, mở file “build.gradle”, bạn tìm đến dòng “applicationId”, bạn sửa lại dòng này thành id bạn muốn (lưu ý định dạng com.example.app), copy nó và dán vào phần Android package name trong Firebase.
Tiếp đến phần Debug signing certificate SHA-1, nếu app của bạn không dùng Google Sign in hoặc Dynamic link thì không cần (mình vẫn khuyên bạn nên thêm vào cho chắc). Để lấy được mã SHA-1, bạn mở thư mục cài Android Studio và tìm đến thư mục “jre/bin”, máy của mình sẽ là thư mục “C:\Program Files\Android\Android Studio\jre\bin”. Trong thư mục bin, bạn mở git bash và chạy lệnh “keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android”, sau khi chạy lệnh này, bạn sẽ thấy trên cửa sổ git có một mục là Certificate fingerprints, bên trong đó có mục SHA1, bạn copy toàn bộ phần mã đó dán vào mục SHA-1 bên Firebase.
Nếu như lệnh keytool bị lỗi, các bạn hãy thay đường dẫn thành “keytool -list -v -keystore C:/Users/<Tên user trên máy của bạn>/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android”. Tiếp tục copy mã SHA1 và bỏ vào trong firebase.
Bạn nhấn Next để tiếp tục, ở bước tiếp theo, bạn nhấn vào Download google-services.json, sau đó để nó vào trong thư mục android/app của project.
Tiếp theo, bạn copy dòng “classpath ‘com.google.gms:google-services:4.3.3′”, mở project flutter, tìm đến folder android, mở file build.gradle, bạn tìm đến phần dependencies và dán đoạn code vừa copy vào.
Tiếp tục bạn quay lại Firebase, copy đoạn code “apply plugin: ‘com.google.gms.google-services’”, thêm vào cuối file build.gradle trong folder “android/app” và lưu lại. Quay về Firebase và nhấn Continue to console.
Tiếp theo, bạn copy file google-services.json đã tải ở trên vào thư mục “android/app”. Vậy là chúng ta đã hoàn thành phần config Firebase trong flutter rồi. Sang phần tiếp theo là code flutter để đăng nhập và đăng xuất.
Thêm plugin và code phần đăng nhập
Đầu tiên, mình cần thêm các plugin sau vào file pubspec.yaml:
Trở lại với file main.dart của chúng ta, trong phiên bản rework mới của Google, chúng ta bắt buộc thêm đoạn code sau trước khi chạy bất kỳ dịch vụ nào của Google. Nhớ là phải gọi mọi dịch vụ của Google sau khi initializeApp hoàn tất, nếu không sẽ bị lỗi.
await Firebase.initializeApp();
Vì lý do này, chúng ta cần phải thêm FutureBuilder vào Widget tree để đảm bảo việc initial firebase được thực hiện xong trước khi bất kỳ chức năng nào khác được thực hiên.
// Thêm thư viện firebase_core
import 'package:firebase_core/firebase_core.dart';
class _MyHomePageState extends State<MyHomePage> {
// Thêm dòng này
final Future<FirebaseApp> _initialization = Firebase.initializeApp();
// Trong body của Scaffold
// Bọc Widget Center bằng FutureBuilder
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Firebase Login'),
),
body: FutureBuilder(
future: _initialization,
builder: (context, snapshot) {
// Kiểm tra xem có bị lỗi khi initialize không
if (snapshot.hasError) {
return Text('Something went wrong');
}
// Nếu thành công thì hiển thị như lúc đầu chúng ta đã tạo
if (snapshot.connectionState == ConnectionState.done) {
return Center(
// Code goes here
);
}
// Đang load
return CircularProgressIndicator();
}
}
Sau khi xong các bạn có thể run app để check thử xem có bị lỗi không. Nếu không có thì chúng ta tiếp tục thêm tính năng login.
import'package:flutter/material.dart';// import thêm hai thư viện nàyimport'package:firebase_auth/firebase_auth.dart';import'package:google_sign_in/google_sign_in.dart';// ...class_MyHomePageStateextendsState<MyHomePage>{
String _message ='You are not sign in';// Thêm các đoạn code sau
FirebaseAuth _auth;
GoogleSignIn _googleSignIn;
Future<User>_handleSignIn()async{final GoogleSignInAccount googleUser =await _googleSignIn.signIn();final GoogleSignInAuthentication googleAuth =await googleUser.authentication;final AuthCredential credential = GoogleAuthProvider.credential(
accessToken: googleAuth.accessToken,
idToken: googleAuth.idToken,);final User user =(await _auth.signInWithCredential(credential)).user;print("signed in "+ user.displayName);setState((){// User đã login thì hiển thị đã login
_message ="You are signed in";});return user;}
Future _handleSignOut()async{await _auth.signOut();await _googleSignIn.signOut();setState((){// Hiển thị thông báo đã log out
_message ="You are not sign out";});}
Future _checkLogin()async{// Khi mở app lên thì check xem user đã login chưafinal User user = _auth.currentUser;if(user !=null){setState((){
_message ="You are signed in";});}}// ...if(snapshot.connectionState == ConnectionState.done){// Chỉ có thể thực hiện các dịch vụ Google sau khi initializeApp hoàn tất
_auth = FirebaseAuth.instance;
_googleSignIn =GoogleSignIn();_checkLogin();// Code goes hereOutlineButton(
onPressed:(){_handleSignIn();},
child:Text('Login'),),OutlineButton(
onPressed:(){_handleSignOut();},
child:Text('Logout'),),// Code goes here}// ...
Code của mình đơn giản chỉ có vậy. Nhưng hiện giờ bạn chưa thể login được đâu, bạn cần bật phương thức đăng nhập bằng Google Account trong Firebase Console. Cách thực hiện như sau: bạn mở tab Authentication, nhấn vào button Set up a sign-in method.
Tiếp theo, bạn nhấn vào dòng Provider là Google, chọn Enable. Sau đó, ở phần Project public-facing name bạn đặt tên gì cũng được, nó sẽ là tên hiển thị trong phần hỏi user khi login. Phần project support email, bạn chọn email của bạn và nhấn Save.
Vậy là chúng đã xong rồi, giờ là lúc chúng ta run app và test thử. Một lưu ý nhỏ cho các bạn là các bạn dùng Login với Google thì phải run trên máy ảo có Google Play, hoặc chạy trên máy thật cho nó chắc, nếu không app sẽ bị lỗi. Và đây là kết quả!
Nếu như bạn nào gặp phải lỗi build app, bạn nên xem lại các cái version của dependencies, classpath, đã chỉnh sửa lại như trong bài viết chưa (mình sẽ có gắng update bài liên tục), nếu vẫn chưa được, bạn hãy migrate sang android X, chỉnh minSdkVersion (trong file “android/app/build.gradle”) từ 16 sang ít nhất là 21. Nếu vẫn chưa giải quyết được bạn có thể comment phía bên dưới mình sẽ giúp đỡ bạn.
Tổng kết
Vậy là trong bài này, mình đã hướng dẫn các bạn tích hợp Firebase vào Flutter và đăng nhập với Google Sign In. Nếu các bạn có thắc mắc dì có thể để lại comment phía bên dưới, mình sẽ giúp nếu có thể. Nếu Firebase có update, các plugin có thay đổi hoặc flutter có thay đổi, bài viết này không còn áp dụng được nữa, bạn có thể vào trang Liên hệ để thông báo với mình, mình sẽ update lại bài viết này nha.
Bài viết này sẽ được mình cập nhật khi có thay đổi lớn diễn ra. Nếu các bạn gặp vấn đề với các method bị Deprecated thì có thể comment bên dưới, mình sẽ cố gắng cập nhật bài viết sớm nhất có thể nha. Trong bài này mình chỉ hướng dẫn các bạn cách có thể thêm firebase và login bằng Google thôi, code chưa được tổ chức hợp lý nên các bạn có thể tổ chức lại cho dễ quản lý hơn nha.
Các bạn có thể xem code tại GitHub của mình. Hy vọng bài viết này hưu ích đối với các bạn, nếu bạn thấy bài viết hay, hãy share bài viết để mọi người cùng biết nha ^^. Cảm ơn các bạn đã đọc bài viết của mình!
javascript Dịch từ bài viết của tác giả: Kevin Gardner
Giới thiệu
Lập trình từ khi ra đời cho đến nay vẫn không ngừng phát triển. Bạn càng có kỹ năng coding tốt thì càng có nhiều cơ hội làm việc tốt hơn. Quan trọng là hãy biết cách “làm mới” mình mỗi ngày, đừng tự mãn với những gì mình có mà hãy cố gắng học hỏi thêm thật nhiều kiến thức mới từ những kiến thức cơ bản như ngôn ngữ JavaScript đến các ngôn ngữ, kỹ thuật chuyên môn hơn như Assembly, C,…. Dưới đây là 5 chiến thuật tuyệt vời bạn có thể áp dụng để trở thành một dev giỏi hơn.
5 chiến thuật học hỏi tốt nhất (áp dụng cả với JavaScript)
1. Lên kế hoạch để vượt qua điểm yếu của bản thân
Một trong những kỹ năng quan trọng của dev là biết mình cần phải làm gì. IT là một lĩnh vực rộng nên mỗi dev chỉ cần tập trung vào đúng lĩnh vực chuyên môn của mình và làm tốt nhất có thể trong khả năng với một số nhiệm vụ hay ngôn ngữ lập trình nhất định.
Cần biết cách vượt qua điểm yếu của chính mình
Khi mới bắt đầu bạn nên làm quen với ngôn ngữ JavaScript cơ bản. Đó là ngôn ngữ nền tảng web chuẩn, được sử dụng phổ biến nhất và thường được ứng dụng trong build mobile app. Bạn cũng nên cân nhắc về khả năng tài chính của mình để đăng kí thêm những khóa học JavaScript online hoặc tự học để trau dồi kiến thức, khắc phục các điểm yếu trong chuyên môn của mình.
2. Luôn có một dự án trong quá trình hoạt động, nhất là với code mới
Ngoài các công việc thường ngày, dev nên làm thêm các dự án phụ bên ngoài để nâng cao khả năng cũng như giới hạn của bản thân. Việc làm thêm những task mới chắc chắn sẽ giúp bạn học hỏi rất nhiều điều bổ ích khác như một kỹ thuật mới, ngôn ngữ mới, kiến thức mới chẳng hạn. Học tập chưa bao giờ là việc dễ dàng, nhất là trong lĩnh vực IT, từ ngôn ngữ lập trình JavaScript, C/C++,… đến các kỹ thuật chuyên môn khác, đều cần sự kiên trì, chăm chỉ rèn luyện. Hãy cố gắng giữ cho bản thân động lực cao nhất để hoàn thành nhiều việc hơn, từ đó nâng cấp trình độ của bạn lên một vị trí mới.
3. Tham khảo ý kiến với các lập trình viên đi trước bất cứ khi nào có thể
Bạn có thể học hỏi được nhiều thứ từ những tiền bối trong nghề vì họ có nhiều kinh nghiệm làm việc hơn. Bạn có thể nhờ các đồng nghiệp trong công ty hỗ trợ và giải thích khi gặp một số công việc hay chưa hiểu rõ về JavaScript cơ bản,… vấn đề mà bạn không quen thuộc. Hoặc bạn có thể tham khảo thêm ý kiến của những người đi trước thông qua các nền tảng trực tuyến như đặt câu hỏi trên Google, Reddit, YouTube, blog hoặc Codecademy.
Hãy học hỏi cách người khác viết code. Đó là một nguồn tài nguyên tuyệt vời để bạn mở mang tầm mắt và suy nghĩ của mình, học hỏi thêm nhiều thứ từ cách mà người khác xử lý vấn đề.
4. Không chỉ dừng lại ở một lần viết code, nhất là với JavaScript
Bạn sẽ không bao giờ có thể cải thiện được kỹ năng viết code của mình nếu chỉ viết đến khi code có thể chạy được và ngay lập tức dừng lại, hoặc chỉ đơn thuần là copy và paste mà không tìm hiểu lý do tại sao code đó hoạt động được. Với ngôn ngữ lập trình JavaScript chẳng hạn, bạn nên cố gắng viết code đến khi nào bạn hoàn toàn hiểu hết về chúng thì lúc đó mới có thể gọi là đã hoàn thành một dự án. Có một sự thật là bạn có thể viết code bằng tay trên giấy, tuy hơi mất thời gian nhưng đây được xem là cách giúp cải thiện kỹ năng coding đáng kể dù đang ở trình độ nào đi chăng nữa.
Code luôn luôn có thể cải thiện được để nó hoạt động nhanh hơn, đáng tin cậy hơn. Nếu bạn thật sự muốn đạt trình độ bậc thầy coding, bạn nên viết code cho một dự án ít nhất 3 lần. Nghĩa là sau khi viết code 1 lần và nó đã chạy được, bạn hãy viết tiếp thêm lần nữa, viết mới hoàn toàn. Cứ như thế, sau 3 lần bạn sẽ tìm ra được đâu mới là sản phẩm thật sự chất lượng, đáp ứng đầy đủ các thông số kỹ thuật cho yêu cầu của dự án.
5. Không nên chỉ học một ngôn ngữ lập trình
Mỗi ngôn ngữ lập trình (JavaScript, Golang, Java,…) đều có ưu và nhược điểm riêng, các dev không nên có suy nghĩ phiến diện rằng chỉ có ngôn ngữ này thì tốt và ngôn ngữ khác thì vô dụng và không đáng để học hỏi. Học một ngôn ngữ mới mang lại cho bạn một góc nhìn mới và có thể giúp bạn xử lý các dự án đang triển khai với chuyên môn cao hơn.
Bạn có thể bắt đầu học thêm về ngôn ngữ C / C ++, JavaScript, Ruby, Python, Django, Pascal và NodeJS,… Học thêm ngôn ngữ lập trình khác, với cách tiếp cận và tư duy khác nhau sẽ cho bạn cơ hội hiểu được vấn đề ở nhiều góc độ khác nhau. Giúp các dev mở rộng suy nghĩ và sáng tạo hơn trong quá trình làm việc của mình.
Kết luận
Có nhiều cách khác nhau để bạn có thể nâng cao trình độ coding của mình và tìm được việc làm phù hợp tại các công ty như Gear Inc. Hãy cân nhắc với các tip hữu ích nhất và từ đó rút ra kinh nghiệm làm việc phù hợp nhất với bản thân mình nhé!
Bài viết được sự cho phép của tác giả Nguyễn Hữu Đồng
Hi xin chào các bạn sau chuỗi ngày dài trốn dịch thì mình đã quay trở lại, chợ bị yêu cầu đống cửa, chả buôn bán được gì nên mình lại có thời gian rảnh để mà vọc vạch, tình cờ nghe ông anh nói qua serverless đồ các kiểu thì mình cũng thấy hứng thú, trong bài viết này mình sẽ chia sẻ những thứ mà mình đã vọc vạch trong ngày vừa qua.
Deploy application từ docker image
Ý tưởng đơn giản là bạn sẽ đống gói ứng dụng thành docker image rồi upload lên docker image repository nào đó như gcloud container registry sau đó sử dụng một dịch vụ hỗ trợ chạy container từ docker image như google cloud run.
Không auto Deploy khi push code lên GitHub(auto Deploy nằm ở phần dưới)
Build ứng dụng ra Docker Image
Trong ví dụ này mình sẽ dùng blog của mình làm ví dụ. Project này sử dụng nextjs, mỗi khi mình viết một bài mới thì mình sẽ build code rồi export ra static file, mình không cần phải làm phức tạp, vì với blog này chỉ cần static file là đủ.
Các bạn để ý thì thấy mình có sử dụng nginx để serve static file
Nginx sẽ lắng nghe request, dựa vào path mà xem có file nào match không, không thì nó sẽ gửi file index.htmlvà nếu không thấy fileindex.html nữa thì trả về 404
FROM nginx:1.14WORKDIR /usr/share/nginx/htmlCOPY out /usr/share/nginx/html/
COPY 404.html .
COPY nginx.conf /etc/nginx/conf.d/default.confEXPOSE 80
Khi build image thì mình sẽ copy tất cả file trong thư mục out vào /usr/share/nginx/html/ Sau đó copy file nginx.conf vào /etc/nginx/conf.d/default.conf để nginx dùng cho việc tạo server serve static file.
➜ dongnguyen.dev git:(master) ✗ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 45bbe32cd01c 32 seconds ago 138MB
2. Đưa image lên Google Container Registry
container registry là nơi mà ta sẽ lưu trữ image, để push được image lên đây thì docker của các bạn cần phải được config để có quyền. Ở đây mình dùng gcloud cli để cấp quyền cho docker và nếu các bạn chưa cài gcloud cli thì có thể xem hướng dẫn cài đặt, cài đặt tài khoản cho cli tại đây.
➜ dongnguyen.dev git:(master) ✗ sudo gcloud auth configure-docker
Password:
WARNING: Your config file at [/Users/gopher/.docker/config.json] contains these credential helper entries:{
"credHelpers": {
"asia.gcr.io": "gcloud",
"staging-k8s.gcr.io": "gcloud",
"us.gcr.io": "gcloud",
"gcr.io": "gcloud",
"marketplace.gcr.io": "gcloud",
"eu.gcr.io": "gcloud"
}
}
Adding credentials for all GCR repositories.
WARNING: A long list of credential helpers may cause delays running 'docker build'. We recommend passing the registry name to configure only the registry you are using.
gcloud credential helpers already registered correctly.Updates are available for some Cloud SDK components. To install them,
please run:
$ gcloud components update➜ dongnguyen.dev git:(master) ✗
Vậy là xong việc cấp quyền, việc tiếp theo là đánh tag cho nó và upload lên.
➜ dongnguyen.dev git:(master) ✗
Deploying container to Cloud Run service [blog] in project [tough-racer-272817] region [asia-east1]
✓ Deploying... Done.
✓ Creating Revision...
✓ Routing traffic...
✓ Setting IAM Policy...
Done.
Service [blog] revision [blog-00014-dax] has been deployed and is serving 100 percent of traffic at https://blog-k3ndrinnqq-de.a.run.app
➜ dongnguyen.dev git:(master) ✗
Để tự động hóa quá trình build và deploy thì mình dùng đến dịch vụ google cloud build, trình tự sẽ như thế này, kết nối GitHub repository với cloud build, tạo một triggerđến một event từ githubví dụ như là khi push to a branch, push new tag
Ví dụ như trong hình mình setup một trigger cứ mỗi khi mình push code lên branch master thì cloud buildsẽ tiến hành làm những công việc mình đã định nghĩa trong file cloudbuild.yaml
Chạy lệnh để deploylên cloud run với image có tag latest
Nhưng trước tiên, bạn phải setup kết nối gitHub repository và cấp quyền cho cloud build với thêm hai role Cloud Run Admin vàCloud Run Service Agent là trong cài đăt IAM
Và bây giờ mọi thứ đã có thể diễn ra tự động rồi, mình sẽ commit code và push lên branch master, và đây là kết quả
Thực ra thì cái gì cũng có hạn chế, serverless (Google cloud Platform) cũng vậy, đây là một vài issue đang tồn tại của Cloud Run nhưng so với nhau cầu serve static file hay là host một web api của mình thì cái này cũng đủ rồi.
Bài viết được sự cho phép của BBT Tạp chí Lập trình
Nếu chúng ta đánh giá cao tính độc lập, nếu chúng ta cảm thấy phiền lòng về sự phát triển kiến thức, giá trị và thái độ theo cùng một khuôn mẫu mà hệ thống hiện tại tạo ra, thì chúng ta có thể mong muốn tạo lập môi trường học tập khuyến khích sự khác biệt, tự định hướng và tự học.
—Carl Rogers, On Becoming a Person
Bối cảnh
Bạn đã xác định được những kĩ năng mình còn thiếu, những kỹ năng đó liên quan trực tiếp tới công việc hàng ngày của bạn.
Vấn đề
Có rất nhiều công cụ và kỹ thuật mà bạn cần phải nắm vững, nhưng bạn không biết cách để bắt đầu. Những người xung quanh bạn dường như đã biết một số kỹ năng đó, và họ kỳ vọng rằng bạn cũng đã lam chủ được các kiến thức này.
Giải pháp
Hãy chọn một kỹ năng, công cụ hoặc một kỹ thuật nào đó để lấp đầy khoản trống còn thiếu.
Hãy thực hiện điều này bằng cách lựa chọn một cách làm hiệu quả nhất đối với mình. Với một số người, cách tiếp cận tốt nhất là tìm hiểu để có cái nhìn tổng quan thông qua việc đọc các bài giới thiệu và danh sách các câu hỏi thường gặp. Một số người khác lại thích bắt tay ngay vào xây dựng một chương trình phần mềm nhỏ, đó là cách hiệu quả giúp họ hiểu rõ vấn đề. Bạn lựa chọn cách tiếp cận nào cũng được, đừng quên hỏi những người có cùng sở thích và cố vấn của bạn để xem họ có kỹ năng này không và họ có sẵn sàng chia sẻ về những gì họ biết không. Đôi khi có những người khác cũng như bạn, đang cố gắng tìm hiểu những kỹ năng này, làm việc cùng nhau sẽ giúp bạn tiến bộ hơn. Đến một thời điểm nào đó, bạn sẽ đạt được trình độ mà mình khá hài lòng trong lĩnh vực mới này, sau đó bạn có thể quyết định liệu có nên đào sâu hơn hay là chuyển sang tìm hiểu các kỹ năng khác. Chúng ta không có đủ thời gian để mài giũa tất cả các kỹ năng đến trình độ cao, vì vậy bạn phải đưa ra lựa chọn của mình.
Trường hợp này rất gần với tình huống không che giấu sự thiếu hiểu biết (Expose Your Ignorance), nhưng bạn sẽ ít ngại ngùng hơn vì có thể tự mình thực hiện, sẽ không có ai biết được những thiếu sót của mình. Tuy nhiên, với tư cách là một người học việc có khát vọng làm chủ kiến thức thì bạn cần sẵn sàng biểu lộ sự thiếu hiểu biết của mình. Sử dụng mô hình này một cách tách biệt (tức là, khắc phục sự thiếu hiểu biết của mình mà không biểu lộ ra ngoài) có nguy cơ tạo ra một văn hoá mà ở đó việc thất bại và học tập không được khuyến khích, tất cả mọi người đều tự học trong im lặng. Nên nhớ rằng học tập công khai là một trong những cách để một người học việc có thể trở thành thợ lành nghề. Đây là một bước nhỏ cần thiết để mọi người thấy được rằng bạn đang cố gắng học, và sau đó họ sẽ dạy bạn.
Kể cả khi áp dụng thành công cách làm này thì nó cũng có thể dẫn đến một số ảnh hưởng xấu. Chẳng hạn, trong trường hợp bạn cần học cách xây dựng các hệ thống đồng thời (concurrent system), các lập trình viên khác sẽ không đánh giá cao nếu bạn tự viết một hệ thống nhắn tin của riêng mình bằng ngôn ngữ Scala thay vì sử dụng một sản phẩm đã có sẵn. Và họ sẽ thấy khó chịu hơn nếu họ không thể hỏi bạn bất cứ một câu hỏi nào về vấn đề này bởi vì đơn giản là bạn đang tham dự một cuộc họp. Và cuối cùng ông chủ của bạn cũng không thể hiểu liệu nhu cầu học của bạn có gây trở ngại trong việc hoàn thành dự án hay không. Tóm lại, bạn cần có đủ sự tinh tinh tế để giữ cho việc học tập của mình không gây ra vấn đề cho nhóm. Một trong những điểm nổi bật của cách tiếp cận thủ công là sẵn sàng đưa lợi ích của cộng đồng lên trước cá nhân, không sử dụng nhóm và khách hàng để phục vụ việc phát triển của cá nhân.
Mặt khác, cũng có người thể hiện sự thiếu hiểu biết của mình nhưng lại không đối mặt với nó. Những người làm điều này chỉ đơn thuần nhún vai xin lỗi, như để nói rằng “đó là điều hiển nhiên”. Việc này khiến họ trở nên thấp kém, thiếu hiểu biết và quá phụ thuộc vào các thành viên khác trong nhóm. Cuối cùng, nó tạo nên các nhóm mà ở đó các thành viên bảo vệ cái “nhà kho” kiến thức nhỏ bé của mình và nhún vai khi gặp một vấn đề nằm trong phạm vi lãnh thổ của người khác.
Vì vậy, điều quan trọng là phải cân bằng giữa mô hình này và việc thể hiện sự thiếu hiểu biết của bạn. Tự đối mặt với sự thiếu hiểu biết của chính mình có thể khiến bạn trở thành một kiêu ngạo không bao giờ hoàn thành được việc gì, còn nếu không thể hiện sự thiếu hiểu biết của chính mình và đối mặt với nó thì bạn sẽ trở nên kém cỏi và vô dụng hơn.
Hành động
Lập một danh sách các kỹ năng mà mình còn non kém (Thể hiện sự thiếu hiểu biến của mình) và cố gắng học từng thứ một để đạt được và loại bỏ nó khỏi danh sách. Khi biết thêm một kiến thức mới, bạn lại có thể phát hiện ra những thiếu sót khác của mình mà đã không nhận ra trước đây, đừng quên thêm chúng vào danh sách của bạn.
Ruby và Python là hai trong số các ngôn ngữ lập trình được sử dụng phổ biến nhất để lập trình ứng dụng. Theo khảo sát hàng năm của Stack Overflow, được đánh giá bởi hơn 90.000 lập trình viên trên toàn thế giới. Ruby và Python nằm trong Top 15 ngôn ngữ lập trình có nhu cầu cao nhất trong năm 2019. Cho bạn nào chưa biết thì trên thế giới có khoảng 700 ngôn ngữ lập trình nhé.
Ruby và Python có rất nhiều điểm chung. Chúng đều là các ngôn ngữ hướng đối tượng bậc cao, tập trung vào sự đơn giản và rõ ràng. Tuy nhiên, như trên tiêu đề của bài viết, hôm nay chúng ta sẽ so sánh hai ngôn ngữ này để tìm ra ngôn ngữ nào tốt hơn cho các dự án lập trình ứng dụng web của bạn.
Trước tiên, chúng ta hãy bắt đầu tìm hiểu những thông tin cơ bản về Ruby và Python trước khi tiến hành so sánh.
Ruby
Ruby được phát hành vào năm 1995. Yukihiro Matsumoto, người sáng lập Ruby, cho biết: Mục đích của Ruby là làm cho các lập trình viên cảm thấy hài lòng. Ruby được thiết kế như một ngôn ngữ thân thiện với các lập trình viên. Nó cũng là một ngôn ngữ rất linh hoạt cho phép các lập trình viên dễ dàng thay đổi các yếu tố của nó và kết hợp các cách tiếp cận khác nhau theo nhiều cách mạnh mẽ. Ngôn ngữ này tập trung vào nhu cầu của con người, chứ không phải là máy tính.
Bất kỳ loại phần mềm nào cũng có thể được tạo ra với sự trợ giúp của Ruby, từ web đến các ứng dụng di động. Tuy nhiên, Ruby có thể được sử dụng cho nhiều mục đích khác nhau, nhưng nổi tiếng nhất vẫn là dùng để xây dựng các ứng dụng web. Ruby on Rails (RoR), một framework ứng dụng web mã nguồn mở được viết bằng Ruby, tập trung vào việc lập trình đơn giản nhưng hiệu quả. RoR được các lập trình viên yêu thích vì nó cung cấp cho họ các công cụ có sẵn giúp việc lập trình ứng dụng cực kỳ nhanh.
Ruby là ngôn ngữ lập trình hướng đối tượng. Trong Ruby, mọi giá trị, thậm chí là class, đều là đối tượng – object. Behavior mặc định có thể được sửa đổi bằng cách thêm các methods (phương thức) mới vào class và mở rộng các class tuỳ chỉnh. Ngoài ra, Ruby còn cho phép các lập trình viên sử dụng lại code và các đơn vị lập trình logic cho các dự án khác. Bên cạnh đó, lập trình hướng đối tượng đảm bảo tính kết hợp các đối tượng lại với nhau thành các mô đun để cấu trúc dự án trở nên rõ ràng hơn.
Ruby sử dụng trình thu gom rác là một hệ thống quản lý bộ nhớ tự động, do đó, lập trình viên không phải phân bổ bộ nhớ theo cách thủ công. Bên cạnh các tính năng hữu ích khác, Ruby còn có khả năng thích ứng cao và dễ dàng chấp nhận các bản cập nhật và bản phát hành mới.
Python được tạo ra bởi một lập trình viên người Hà Lan, Guido van Rossum. Được phát hành vào năm 1991, Python là ngôn ngữ lập trình đa năng nhất cho việc lập trình back-end. Python là một ngôn ngữ kịch bản mạnh mẽ (scripting language) cho phép bạn tạo các tập lệnh và thực hiện nó nhiều lần mà không cần tốn nhiều thời gian code.
Giống như Ruby, Python là một ngôn ngữ hướng đối tượng bậc cao. Triết lý mà Python tập trung nhiều nhất là khả năng đọc. Code Python cũng giống như nói chuyện tiếng Anh với nhau vậy, cú pháp của nó rất dễ sử dụng và rất đơn giản để đọc. Đó là lý do tại sao Python là ngôn ngữ tuyệt vơi nhất cho beginners. Python cũng có tiếng tăm trong giới những lập trình viên có kinh nghiệm, những người này thường sẽ chọn Python là ngôn ngữ thứ hai hoặc thứ ba để học.
Python được thiết kế cho các chương trình khoa học và học thuật. Nó có thể xử lý khá nhanh chóng các dữ liệu lớn và được sử dụng để lập trình các trang web nặng. Python là ngôn ngữ lập trình được ưu thích nhất cho trí tuệ nhân tạo, machine learning và các ứng dụng Robot. Python còn có thể được sử dụng để lập trình các ứng dụng di động.
Python là ngôn ngữ đa nền tảng mà không cần cài đặt (portable code). Điều đó có nghĩa là các lập trình viên có thể sử dụng code Python trên nhiều hệ điều hành (Linux, Windows, Mac, Unix) mà không cần phải thay đổi code.
Framework web mã nguồn mở, Django, khuyến khích việc lập trình nhanh chóng và sạch sẽ. Framework mạnh mẽ này được dùng để xây dựng một số trang web phổ biến như Spotify, Instagram và YouTube. Không có gì ngạc nhiên khi theo đánh giá PYPL của Github, Python là ngôn ngữ lập trình phổ biến nhất trong năm 2020.
Ruby vs Python: Những khác biệt chính
Như đã được đề cập, cả Ruby và Python đều là các ngôn ngữ kịch bản hướng đối tượng bậc cao thuộc thế hệ mới. Tuy nhiên, sự khác biệt chính giữa chúng là nằm ở triết lý đằng sau của mỗi ngôn ngữ. Ruby nhằm mục đích làm các lập trình viên hài lòng với cú pháp thanh lịch và đẹp đẽ, trong khi nhiệm vụ chính của Python là làm cho mọi thứ trở nên rõ ràng với các lập trình viên. Ruby cung cấp cho các lập trình viên sự tự do và linh hoạt. Họ có thể giải quyết vấn đề bằng các phương pháp khác nhau, trong khi Python chỉ có một cách chính xác để giải quyết vấn đề. Các cách tiếp cận khác nhau làm cho Ruby và Python phù hợp với các loại ứng dụng web khác nhau.
Dưới đây là bảng so sánh sự khác biệt chính giữa Python và Ruby.
Khi nào nên chọn Ruby?
Ruby sẽ là sự lựa chọn tuyệt vời cho các doanh nghiệp nhỏ và các công ty khởi nghiệp mong muốn lập trình các ứng dụng nhanh. Ruby rất hữu ích khi bạn có nhu cầu xây dựng một nguyên mẫu nhanh ngay cả khi dự án chưa được xác định rõ ràng và sẽ có các thay đổi trong tương lai. Nhìn chung, Ruby được khuyến nghị trong các trường hợp có thời gian ngắn và bị giới hạn về ngân sách.
Nếu bạn cần tìm các ví dụ cụ thể hơn về các loại ứn dụng được xây dựng tốt nhất với Ruby, thì đó là các trang web thương mại điện tử và phát nhạc trực tuyến. Shopify là một ví dụ đầy cảm hứng về giải pháp thương mại điện tử phức tạp được lập trình với sự trợ giúp của framework Ruby on Rails đã có mặt trên thị trường từ năm 2006 và là ngôi nhà chung cho hơn 800 ngàn của hàng trực truyến.
Framework Ruby on Rails hoàn toàn phù hợp với lập trình các ứng dụng web tuỳ chỉnh nhiều chức năng. Ruby còn có một trong những cộng đồng mạnh nhất, đảm bảo tài liệu đầy đủ và chính xác, kèm theo đó là một thư viện rộng lớn được gọi là Ruby gems. Chúng cung cấp các chức năng đặc biệt cho các ứng dụng Ruby và tăng tốc mọi giai đoạn trong quá trình lập trình.
Đồng thời, bạn phải nhớ rằng Ruby không phải là lựa chọn tốt nhất để tạo ra các ứng dụng web đòi hỏi phải kiểm soát toàn bộ kiến trúc sản phẩm, modules chương trình hoặc tích hợp dữ liệu.
Khi nào nên chọn Python?
Python sẽ là lựa chọn tốt hơn cho các giải pháp và ứng dụng khoa học phức tạp trên cloud. Nó cũng được sử dụng để lập trình các ứng dụng có quy mô theo chiều ngang. Các ứng dụng như vậy giúp quản lý khối lượng công việc thay đổi thường xuyên.
Xây dựng các ựng dụng với Python, có thể vượt xa các dự tích lập trình web ban đầu so với khi sử dụng Ruby. Bởi vì Python được sử dụng trong các ngành công nghiệp khác nhau, từ khoa học dữ liệu đến robot. Đó là lý do tại sao cộng đồng Python là một trong những cộng đồng đa dạng nhất. Trên Stack Overflow, cộng đồng trực tuyến lớn nhất và đáng tin cậy nhất dành cho các lập trình viên, có hơn 1.455.817 câu hỏi về Python.
Python, kết hợp với thư viện TensorFlow, đơn giản hoá đáng kể việc lập trình các giải pháp dựa trên AI vì nó có các thuật toán machine learning tích hợp. Python cũng được sử dụng rộng rãi trong xử lý và phân tích dữ liệu. Nó đặc biệt hữu ích trong phân tích âm thanh và video nhờ khả năng hiển thị dữ liệu và khả năng sắp xếp dữ liệu của nó.
Sẽ là không công bằng khi tuyên bố đâu mới là người chiến thằng. Cả hai đều là ngôn ngữ bậc cao mạnh mẽ được các lập trình viên yêu thích. Tuy nhiên, bạn phải nhớ rằng Ruby và Python phù hợp với các loại ứng dụng khác nhau. Nếu bạn đang có kế hoạch lập trình các trang web và ứng dụng dữ liệu nặng với các yếu tố có machine learning, hãy chọn Python. Trong trường hợp, bạn muốn lập trình ứng dụng web nhanh, Ruby sẽ là sự lựa chọn tuyệt vời.