Bên cạnh những báo cáo mới nhất của TopDev về nhu cầu nhân lực ngành IT, vốn đang rất nóng trong thời gian gần đây, một trong các nguyên nhân chính là sự bùng nổ của các dịch vụ tiện ích do ứng dụng công nghệ giúp thay đổi cuộc sống và môi trường kinh doanh tại Việt Nam, TopDev xin được phép cung cấp bản báo cáo “Vietnam IT Landscape – Các công ty công nghệ tại Việt Nam đang làm gì” được cập nhật mới nhất và đầy đủ nhất của toàn bộ thị trường IT.
Bản báo cáo sẽ giúp chúng ta có được nhìn toàn cảnh về các ứng dụng công nghệ góp phần thay đổi cuộc sống đến từ các công ty công nghệ tại Việt Nam.
Những doanh nghiệp được đề cập trong bản báo cáo này bao gồm các doanh nghiệp có các hoạt động liên quan nhiều đến việc tuyển dụng IT mạnh mẽ và đa dạng trong khoảng thời gian gần đây. Bao gồm nhiều lĩnh vực công nghệ khác nhau.
Những số liệu và thông tin dùng trong bản báo cáo được cung cấp từ các chuyên gia, diễn giả, nhà nghiên cứu và các doanh nghiệp tham gia hoạt động Employer Branding, Networking và Marketing mạnh mẽ tại Việt Nam, cũng như kết hợp với những thông tin được lựa chọn và tổng hợp từ nhiều nguồn dữ liệu của TopDev.
Lập trình viên hiện nay là nghề được rất nhiều bạn trẻ theo đuổi, được mệnh danh và “vua của mọi nghề” và mức lương cao ngất ngưỡng. Sự thật có phải như vậy không? Bạn đã thật sự hiểu rõ nghề lập trình viên là gì, công việc cụ thể như thế nào? Cùng Topdev tìm hiểu tổng quan về ngành lập trình.
Lập trình viên là ai?
Lập trình viên là ai?
Lập trình viên (còn được gọi bằng nhiều cái tên khác như dân IT, developer (dev), coder, programmer…) là người chuyên viết và phát triển phần mềm và ứng dụng bằng cách sử dụng các ngôn ngữ lập trình như Java, Python, C++, JavaScript, PHP và nhiều ngôn ngữ khác. Họ có thể làm việc trong nhiều lĩnh vực khác nhau như phát triển web, ứng dụng di động, hệ thống nhúng, trí tuệ nhân tạo, và nhiều lĩnh vực khác.
Lập trình viên có thể chia thành nhiều loại khác nhau tùy theo ngôn ngữ lập trình, mục đích và phạm vi của chương trình mà họ tạo ra. Ví dụ:
Lập trình viên web: là người thiết kế và xây dựng các trang web, bao gồm cả giao diện và chức năng của web.
Lập trình viên ứng dụng: là người phát triển các ứng dụng cho các hệ điều hành khác nhau, như Windows, Android, iOS, v.v.
Lập trình viên phần mềm: là người tạo ra các phần mềm cho các mục đích khác nhau, như giáo dục, giải trí, kinh doanh, v.v.
Lập trình viên game: là người thiết kế và phát triển các trò chơi điện tử cho các nền tảng khác nhau, như PC, console, mobile, v.v.
Công việc của lập trình viên (developer)
Lập trình gồm rất nhiều mảng khác nhau: phần mền, ứng dụng, thiết kế app mobile,… Thế nên tùy thuộc vào vị trí đảm nhận cũng như mô hình của công ty mà mỗi lập trình viên sẽ làm các công việc cụ thể khác nhau, bao gồm một số công việc chính:
Phân tích và thiết kế: Đầu tiên, developer cần đọc hiểu yêu cầu và có kế hoạch thiết kế cấu trúc chương trình.
Viết code: Sau khi đã có hướng đi cụ thể, các programmer sẽ sử dụng ngôn ngữ lập trình phù hợp để triển khai các chức năng.
Chạy thử và fix lỗi: Chạy thử chương trình, kiểm tra và fix bug (phần này là khiến nhiều anh em coder sợ nhất).
Bảo trì và nâng cấp: Duy trì và cập nhật chương trình.
Hợp tác làm việc nhóm: Phối hợp với đồng nghiệp khác, ví dụ bộ phận SEO hay designer để hoàn thành dự án.
Các kỹ năng cần có để trở thành một lập trình viên
Các kỹ năng cần có để trở thành một lập trình viên
Kỹ năng chuyên môn
Sử dụng thành thạo một hoặc nhiều ngôn ngữ lập trình như Java, Python, C++, JavaScript,…
Một trong các kỹ năng quan trọng của dev là cấu trúc dữ liệu và giải thuật, nó cho thấy được tư duy của lập trình viên. Đây là phần các nhà tuyển dụng rất coi trọng và có mặt hầu hết trong các bài test phỏng vấn.
Có kỹ năng làm việc với các hệ quản trị cơ sở dữ liệu như MySQL, PostgreSQL, MongoDB.
Có khả năng tư duy thiết kế dài hạn, triển khai và phát triển mở rộng hệ thống.
Kỹ năng mềm
Kỹ năng giao tiếp và làm việc nhóm: Truyền đạt rõ ràng các giải pháp kỹ thuật và ý tưởng của mình cho đồng nghiệp và khách hàng, sẵn sàng tiếp nhận góp ý và thay đổi.
Giải quyết vấn đề:
Phân tích: Khả năng phân tích vấn đề một cách logic và có hệ thống.
Sáng tạo giải pháp: Tìm kiếm các giải pháp hiệu quả và sáng tạo cho các vấn đề kỹ thuật.
Quản lý thời gian: Xây dựng kế hoạch làm việc rõ ràng và hiệu quả, xác định các công việc ưu tiên và thực hiện chúng trước.
Tính kiên nhẫn và tỉ mỉ:
Kiên trì: Theo đuổi việc giải quyết vấn đề đến cùng mà không bỏ cuộc.
Chú ý đến chi tiết: Đảm bảo mã nguồn và các giải pháp kỹ thuật không có lỗi nhỏ.
Khả năng học hỏi:
Tự học: Khả năng tự nghiên cứu và cập nhật kiến thức mới.
Thích nghi: Thích ứng nhanh với công nghệ mới và các thay đổi trong môi trường làm việc.
Ngoại ngữ: Hiện nay ngoại ngữ (chủ yếu là tiếng Anh) được các doanh nghiệp rất chú trọng khi chọn ứng viên. Đặc thù ngành lập trình là nhiều tài liệu tham khảo tiếng Anh, nên bạn cần có kỹ năng đọc hiểu. Hơn nữa, số lượng các công ty nước ngoài đầu tư vào ngành IT ở Việt Nam ngày càng lớn, vì thế để có được công việc tốt với mức lương cao bạn cần có ngoại ngữ.
Học ngành gì để làm được lập trình viên?
Để trở thành lập trình viên, bạn có thể theo học các ngành sau:
Khoa học Máy tính: Bao gồm các kiến thức về thuật toán, cấu trúc dữ liệu, lập trình, hệ điều hành, và cơ sở dữ liệu.
Kỹ thuật Phần mềm: Tập trung vào quy trình phát triển phần mềm, quản lý dự án, và kiểm thử phần mềm.
Công nghệ Thông tin: Cung cấp kiến thức về mạng máy tính, bảo mật thông tin, và quản trị hệ thống.
Kỹ thuật Máy tính: Kết hợp giữa phần cứng và phần mềm, bao gồm thiết kế vi mạch và lập trình hệ thống nhúng.
Nghề lập trình viên có những ưu nhược điểm gì?
Ưu điểm
Thu nhập hấp dẫn
Nhu cầu về kỹ thuật viên và lập trình viên đang tăng lên, đặc biệt là trong bối cảnh của cuộc Cách mạng Công nghiệp 4.0. Do đó, nguồn cung cầu lao động của lập trình viên đang tăng lên, làm tăng giá trị của nghề nghiệp này.
Thêm nữa, lập trình viên có thể kiếm được một số tiền khá lớn nhờ vào kinh nghiệm và kỹ năng của mình. Nếu bạn có kỹ năng về các ngôn ngữ lập trình phổ biến như Java, Python, C++, hoặc Ruby on Rails, bạn có thể tìm được một số công việc lương cao. Bên cạnh đó, các lập trình viên có thể cải thiện thu nhập của mình bằng cách chuyển sang các lĩnh vực như quản lý dự án, giám sát, hoặc đào tạo lập trình viên mới.
Cơ hội nghề nghiệp rộng mở
Cơ hội việc làm của lập trình viên ngàng càng cao
Hiện nay, các công ty CNTT đang phát triển rất nhanh chóng và đa dạng với nhiều lĩnh vực, từ phát triển ứng dụng di động, trò chơi, trí tuệ nhân tạo, đến an ninh mạng, khoa học dữ liệu và điện toán đám mây. Điều này tạo ra cơ hội cho lập trình viên để phát triển và chuyển đổi sang các lĩnh vực khác nhau nếu họ muốn thay đổi công việc hoặc mở rộng kiến thức của mình.
Bên cạnh đó, lập trình viên có thể làm việc trong các lĩnh vực khác nhau như y tế, giáo dục, tài chính, thương mại điện tử và các ngành công nghiệp khác. Điều này mở ra nhiều cơ hội nghề nghiệp cho các lập trình viên và giúp họ khai thác tiềm năng của mình trong các lĩnh vực khác nhau.
Lập trình viên thường làm việc trong ngành công nghệ thông tin, nơi mà các công ty thường có nhu cầu cao về sự sáng tạo và sự sẵn sàng đáp ứng với các thay đổi nhanh chóng trong thị trường. Vì vậy, môi trường làm việc của lập trình viên thường được thiết kế để tạo ra một sự linh hoạt và đa dạng trong các dự án và nhiệm vụ.
Một điểm đáng chú ý là các công ty công nghệ thường cho phép lập trình viên làm việc từ xa hoặc có thời gian làm việc linh hoạt. Điều này đặc biệt hữu ích đối với những lập trình viên có nhu cầu về thời gian và không muốn bị giới hạn bởi giờ làm việc cố định.
Công việc mang tính toàn cầu
Với sự phát triển của công nghệ thông tin, các công ty phần mềm và công nghệ thông tin đã trở nên phổ biến trên toàn thế giới. Những công ty này thường tìm kiếm các lập trình viên có kỹ năng và khả năng làm việc tốt trong môi trường toàn cầu.
Điều này có nghĩa là lập trình viên có thể làm việc cho các công ty và tổ chức trên toàn thế giới. Điều này mang lại cho lập trình viên nhiều cơ hội hơn để tìm kiếm các dự án và việc làm mới, tăng cơ hội cho sự phát triển nghề nghiệp và thu nhập.
Nhược điểm
Công nghệ thay đổi liên tục – Đòi hỏi sự nhạy bén
Nghề lập trình viên có những ưu nhược điểm gì?
Các công nghệ mới được phát triển và giới thiệu liên tục, điều này đòi hỏi lập trình viên phải cập nhật và học tập những công nghệ mới để giữ được sự cạnh tranh và đáp ứng yêu cầu của thị trường.
Với tốc độ phát triển nhanh chóng của công nghệ, việc học tập và cập nhật liên tục là một yêu cầu bắt buộc đối với lập trình viên. Tuy nhiên, nếu không đủ tư duy linh hoạt và không đủ nỗ lực học tập, các bạn có thể rơi vào tình trạng lạc hậu và khó tìm được việc làm trong thị trường lao động.
Lương cao đi đôi với áp lực
Lập trình viên thường phải đối mặt với các dự án có thời hạn ngắn, yêu cầu chính xác và tính chất phức tạp. Việc hoàn thành các dự án trong thời gian ngắn và đáp ứng yêu cầu của khách hàng có thể tạo ra áp lực rất lớn cho lập trình viên.
Thêm vào đó, lập trình viên thường phải làm việc với các bug, lỗi phát sinh trong quá trình phát triển sản phẩm. Việc tìm kiếm và sửa lỗi có thể mất rất nhiều thời gian và công sức, đồng thời làm tăng áp lực và đòi hỏi kỹ năng giải quyết vấn đề của lập trình viên.
Trong doanh nghiệp hoạt động nhiều dự án, các developer có thể đối mặt với áp lực để đáp ứng các yêu cầu của nhiều dự án cùng lúc. Việc phải quản lý và phân chia thời gian giữa các dự án có thể làm giảm hiệu quả công việc, cũng như ảnh hưởng đến sự cân bằng giữa công việc và cuộc sống cá nhân.
Tiềm ẩn rủi ro về sức khỏe
Lập trình viên thường phải làm việc nhiều giờ liên tục trên máy tính, đồng thời thường phải ngồi ở vị trí cố định trong nhiều giờ mỗi ngày. Điều này có thể dẫn đến các vấn đề về sức khỏe như đau lưng, đau cổ, đau vai và bệnh lý về mắt như căng thẳng mắt, mỏi mắt, và khô mắt.
Thêm vào đó, việc làm việc nhiều giờ liên tục và áp lực công việc cũng có thể dẫn đến căng thẳng và stress, gây ra các vấn đề về sức khỏe tâm lý như lo âu, trầm cảm và rối loạn giấc ngủ.
Cơ hội việc làm và mức lương ngành lập trình
Cơ hội việc làm
Ngành lập trình cung cấp nhiều cơ hội việc làm hấp dẫn trong các lĩnh vực như phát triển phần mềm, phát triển web, phát triển ứng dụng di động, trí tuệ nhân tạo, và an ninh mạng. Các công ty công nghệ, tổ chức tài chính, doanh nghiệp bán lẻ, và các tổ chức giáo dục đều cần các lập trình viên để xây dựng và duy trì hệ thống của họ. Với sự bùng nổ của công nghệ, nhu cầu về lập trình viên ngày càng tăng, đảm bảo cơ hội việc làm ổn định và đa dạng. Ngoài ra nhiều công ty cho phép làm việc từ xa, mở ra cơ hội việc làm toàn cầu cho các lập trình viên.
Mức lương
Mức lương khởi điểm: Lập trình viên mới ra trường thường có mức lương khởi điểm từ 13 – 20 triệu VND/tháng tại Việt Nam.
Lập trình viên có kinh nghiệm: Mức lương của senior developer có kinh nghiệm từ 3 – 5 năm có thể dao động từ 30 – 50 triệu VND/tháng.
Vị trí cao cấp: Các vị trí cao cấp như Tech Lead, Project Manager hoặc CTO có thể nhận mức lương từ 60 triệu VND/tháng trở lên.
TopDev đã cùng bạn tìm hiểu chi tiết về nghề lập trình viên. Đây là một ngành nghề đang hot và chưa có dấu hiệu hạ nhiệt với mức lương tương đối cao. Bạn đang tìm kiếm việc lập trình viên? Truy cập trang việc làm của chúng tôi với hơn 1000+ cơ hội việc làm developer. Chúc các bạn thành công!
Leonardo da Vinci đã từng nói: “Tối giản là đỉnh cao của sự tinh tế”.
Mặc dù đã trải qua biết bao nhiêu thời đại, chân lí này cho đến nay vẫn giữ nguyên vẹn giá trị của nó. Với những sản phẩm mà sự sống còn dựa trên cảm tình và trải nghiệm của khách hàng như website hay app mobile, thì câu nói trên đích thực có sự ảnh hưởng đến các tác phẩm thiết kế của chúng ta…
Xin chớ nhầm lẫn rằng, đơn giản không phải là đơn điệu, hời hợt và nhàm chán. Thay vào đó, sự đơn giản tinh tế đem đến cho thiết kế những nét cuốn hút rất riêng, giúp nó trở nên trực quan và thực sự hữu ích cho người dùng. Những sản phẩm tối giản không những giải quyết được nhu cầu của người dùng, mà còn giúp người dùng tránh tiêu tốn thời gian vào những thứ rườm rà không cần thiết. Rất hiếm khi ta nghe ai đó đánh giá một sản phẩm kĩ thuật số bằng những cụm từ như yêu thương, trân trọng. Mà sẽ mô tả chúng với các từ ngữ quen thuộc như: đẹp, bắt mắt, bóng bẩy (khi nói về giao diện thiết kế), hay trực quan, dễ dùng, khó thao tác (về tính năng), còn (về nội dung) thì là cung cấp nhiều thông tin hữu ích, có chọn lọc…
Hãy trở thành một designer thiết kế trải nghiệm người dùng (UX) có tâm. Vì việc tôn trọng thời gian và công sức của người sử dụng là việc thực sự rất đáng làm, nếu như bạn đang hướng tới nghề thiết kế giao diện (UI). Bài viết này với mục đích gợi ý một số lời khuyên hữu ích về thiết kế giao diện website, giúp người dùng có thể tiết kiệm được thời gian và công sức trong quá trình sử dụng sản phẩm của bạn.
1. Thông tin nào quan trọng thì đưa lên Header
Khi thiết kế website, việc đưa các nội dụng trọng tâm lên header giúp việc nắm bắt thông tin trọng tâm, trở nên dễ dàng và nhanh hơn rất nhiều.
Giga Tamarashvili
Thế thì bây giờ vấn đề nằm ở chỗ, nội dung nào là trọng tâm, thu hút? Đối với các website chứa số lượng lớn thông tin, như các trang thương mại điện tử (Tiki, Lazada…), tin tức (Kenh14, Zing News, Vnexpress…) thì header như là lời giới thiệu nhanh gọn trong vài giây ngắn ngủi, chúng có nhiệm vụ cung cấp đầy đủ những thông tin thiết yếu để thu hút sự chú ý khách hàng (chương trình khuyến mại, hay tin tức đang hot), trước khi họ lướt xuống xem phần ở bên dưới.
Tham khảo những kiểu nội dung bên dưới mà bạn nên đưa lên header:
Những thành phần cơ bản trong bộ nhận dạng thương hiệu: logo, tên thương hiệu, hoạ tiết, hình chụp…
Slogan, hình ảnh công ty hoặc tổ chức, màu sắc chủ đạo…
Những câu chữ giới thiệu lĩnh vực sản phẩm hay dịch vụ công ty
Các liên kết (links) đến các chuyên mục (categories) khác trong website
Liên kết đến các trang mạng xã hội (Facebook, Instagram…)
Thông tin liên lạc cơ bản (số điện thoại, email, địa chỉ, …)
Bảng lựa chọn ngôn ngữ (trường hợp hoạt động đa quốc gia)
Ô tìm kiếm
Ô đăng kí nhận thông tin quảng cáo, hay tin tức (kiểu như điền email khi có khuyến mãi hay thông báo khi có hàng)
Các hành động tương tác với sản phẩm như là đăng kí dùng thử, nút download từ AppStore, Google Play Store
Một lưu ý cực kì quan trọng, bạn không phải cứ tìm mọi chỗ trống để nhồi nhét, lấp đầy tất cả những thứ trên vào thiết kế trừ khi bạn muốn người đọc bị quá tải thông tin khi nhìn vào. Càng nhiều thành phần thu hút sự chú ý, càng khó để người dùng phân biệt thông tin trọng tâm. Các bạn designer sẽ cần phải thảo luận trước với mấy bạn marketer, tìm hiểu kĩ lưỡng xem cần đem cái gì lên header, mà nó mang lại hiệu quả nhất.
Ghani Pradita
Các nghiên cứu gần đây về sự chuyển động (eye-tracking) của mắt người khi tiếp nhận thông tin, đã chỉ ra một sự thật thú vị: Hầu hết mọi người đều di chuyển mắt theo chiều từ trên xuống. Vì vậy, khi đưa những thông tin quan trọng về thương hiệu lên đầu trang web (tức header), sẽ giúp sản phẩm hay dịch vụ của thương hiệu được truyền tải đến người xem một cách nhanh chóng nhất. Đây là một tuyệt chiêu để làm hình ảnh công ty có cơ hội lưu lại trong tâm trí của người dùng một cách âm thầm. Đối với các bạn có ý định tiến xa hơn trên con đường UI/UX, thì thiết kế header là một kĩ năng mà các bạn cần phải thuần phục.
2. Trải nghiệm thương hiệu phải thật ấn tượng
Trong khuôn khổ bài viết, bộ nhận diện thương hiệu (Brand Identity) được đề cập đến chỉ bao gồm các hình ảnh, yếu tố đồ hoạ với mục đích tạo sự chú ý và nhận biết từ khách hàng về sản phẩm hoặc dịch vụ của công ty trên thị trường. Những hình ảnh của thương hiệu có thể được truyền tải đến khách hàng bằng nhiều giác quan khác nhau, ví dụ như qua thị giác, qua lời nói, ngôn ngữ, hay sự cảm nhận.
Outcrowd
Theo các phân tích và nghiên cứu về phân khúc thị trường (target audience), hành vi khách hàng (customer research), ta có thể thấy nhận dạng thương hiệu dường như đóng một vai trò tối quan trọng trong việc quảng bá sản phẩm. Hình ảnh thương hiệu phải được thiết kế làm sao để có thể nhận biết thật nhanh và ghi nhớ dễ dàng.
Trong trường hợp web và mobile, thì bộ nhận diện thương hiệu là những thành phần đồ hoạ miêu tả bề ngoài của công ty như logo, typography, màu sắc, họa tiết… Những thứ trên khi kết hợp lại, sẽ tạo nên một công cụ cực kì đáng gờm mà mỗi công ty sẽ dùng nó để thương hiệu của mình in sâu đậm trong tâm trí khách hàng. Một website hay app chính chủ được đầu tư bài bản, sẽ khiến người dùng cảm thấy an tâm và tin tưởng hơn rất nhiều.
3. Những con số biết nói
Một khảo sát được đăng tải trên trang Nielsen Norman Blog đã tiết lộ cho chúng ta một thông tin khá thú vị: Lúc đọc các thông tin trên trang web, mọi người thường có xu hướng dừng mắt lại ở những con số (dù là nó đang nằm giữa một rừng chữ). Vì trong tiềm thức, chúng ta đều ngầm hiểu, các con số gắn liền với các sự kiện, thông số, kích cỡ, khoảng cách – những thứ được cho là có lợi ích.
Cuberto Dribbble
Bất kể nó thể hiện cái gì đi nữa, các số liệu sinh động luôn có lợi thế hơn so với những đoạn văn bản dài dòng, khô cứng. Điều này giúp phần nội dung của chúng ta được khách hàng quan tâm hơn, cũng như việc tra cứu thông tin trở nên thuận tiện và dễ dàng.
CTA (call to action) hiểu nôm na thì nó giống như một lời mời mọc người dùng bấm nút đặt hàng, download ứng dụng, hay chuyển trang đến một liên kết mong muốn. CTA là cầu nối không thể thiếu giữa khách hàng và sản phẩm.
Mọi thứ trên webiste đếu hướng đến mục đích cuối cùng là làm khách hàng tương tác với CTA, nếu lúc này CTA không được thiết kế tốt, hay khiến người dùng gặp khó khăn khi sử dụng (như kích thước quá nhỏ trên mobile, màu sắc mờ nhạt, vị trí khó tìm thấy, chữ khó đọc…), thì rất có thể những công đoạn trước đó sẽ đổ sông đổ bể.
Zak Steele-Eklund
Nguy hiểm hơn hết, điều này có thể ảnh hưởng tiêu cực đến toàn bộ trải nghiệm, khiến thương hiệu đánh mất cảm tình từ khách hàng. Giờ bạn đã hiểu tầm quan trọng của nút CTA chưa nào? Nói tóm lại, hãy thiết kết nút CTA làm sao để người dùng nhìn ra ngay, mà không mất công tìm kiếm.
5. Tiết kiệm thời gian đọc hiểu thông tin
Như ở phần trên có nhắc đến, người đọc hiếm khi nào dành thời gian để xem toàn bộ nội dung của trang web ngay từ đầu, mà họ thường có thói quen lướt sơ qua xem trước, coi có đúng phần thông tin mà họ cần hay muốn xem không. Trang blog Nielsen Norman Group là một nơi tuyệt vời khi cung cấp những kiến thức thiết kế trải nghiệm người dùng (UX), cũng như những nghiên cứu tâm lí về hành vi người dùng.
Hoveny
Theo như vanseo3design, ta có 3 model chính để mô tả hành trình đọc của mắt: Gutenberg Diagram, Z-Pattern, and F-Pattern.
Đặt các thông tin quan trọng ở những vị trí mà người đọc có cơ hội cao nhìn thấy chúng, bên cạnh đó phân cấp thông tin (visual hierarchy) có chính có phụ sẽ tiết kiệm được rất nhiều thời gian và công sức khi dò tìm thông tin.
6. Thiết kế Icon thật trực quan
Icon, là các biểu tượng, hình ảnh mà ta thường gặp trên website hay app. Sự hiệu quả mà chúng mang lại thì khỏi phải bàn, không những giúp người dùng nắm bắt thông tin nhanh chóng hơn những con chữ khô khan, mà quan trọng hơn, nò còn làm người dùng dễ dàng trong việc tìm kiếm đúng chức năng mong muốn.
Yup Nguyen
Vì thế các icon nên được thiết kế dễ hiểu (nếu cần thì nên chú thích vào thêm) và đầu tư thật kỹ lưỡng, dù đôi khi chỉ là gây nên một chút bối rối, chúng cũng có thể làm cho trải nghiệm người dùng trở nên tệ hại.
7. Nhấn mạnh thông điệp qua các hình ảnh và banner bắt mắt
Slava Kornilov
“Trăm nghe không bằng mắt thấy”, những hình ảnh đẹp đẽ, bắt mắt lúc nào cũng dễ thu hút sự chú ý từ người xem hơn là những dòng chữ khô khan, nhàm chán. Không những truyền tải thông điệp một cách sinh động và trực quan, các hình vẽ minh họa có chất riêng, hay hero banner siêu ngầu, những tấm ảnh chụp thu hút ánh nhìn, sẽ mang lại những lợi ích sau đây:
Làm người xem muốn đọc phần nội dung của bạn
Người xem cảm thấy dễ hiểu và dễ chịu khi nhìn vào
Làm đồng bộ phong cách thiết kế
Cho người xem cảm giác vui vẻ và thích thú
Sản phẩm hay dịch vụ tạo được thiện cảm đối với khách hàng
*Hero banner: Một thuật ngữ dùng để chỉ thể loại banner web nằm ngay đầu trang, kích thước lớn, dùng font chữ to & đậm, với hình ảnh ấn tượng để thu hút sự chú ý ngay từ ban đầu)
8. Hãy cùng chung tiếng nói với người đọc
Một nhân tố cực kì quan trọng nữa mà ta không nên xem thường, đó là phần nội dung (copy content). Lối viết, cách hành văn hay từ vựng phải nhắm đến đúng đối tượng đọc.
Có nhiều bạn không để ý đến vấn đề này, nên nội dung viết thường không phù hợp với đối tượng độc giả. Ví dụ khi mà áp dụng các câu từ quá trang trọng, hay kiểu cách trong một app giải trí, mà đối tượng khách hàng toàn là người trẻ, vốn quen với những ngôn từ thoải mái, bình dị, tự nhiên hơn. Hoặc trường hợp ngược lại, sử dụng những câu chữ bình dân thường ngày cho một website mua/bán các căn hộ cao cấp, sang trọng.
Kết quả là khách hàng có xu hướng tìm đến những website hay app khác để thay thế, do họ cảm nhận được rằng trang web không hề thấu hiểu nhu cầu của họ. Cách giải quyết là tìm một bạn copywriter chuyên nghiệp, cùng làm việc với đội ngũ thiết kế để đưa ra những đoạn nội dung cho thật phù hợp với đối tượng khách hàng.
9. Áp dụng các định luật Gestalt
Định luật Gestalt là một tập hợp các nguyên tắc tâm lý học, lý giải cách thức não người tiếp nhận một hình ảnh nào đó.
Nếu có thể áp dụng nhuần nhuyễn được các nguyên tắc Gestalt vào trong thiết kế UI/UX, designer sẽ giản lược bớt đi rất nhiều hiệu ứng thị giác rườm rà, không cần thiết, nhưng đồng thời vẫn cung cấp đủ cho khách hàng những trải nghiệm thoải mái và hiệu quả.
10. Kiểm tra tốc độ load trang
Thiết kế của bạn dù có ấn tượng bao nhiêu, lộng lẫy bao nhiêu nhưng tốc độ load trang như rùa bò thì cũng thành ra công cốc. Với nhịp sống ngày càng nhanh như thời nay, những thứ như: hình ảnh, videos, chuyển động… mà bắt người dùng chờ quá lâu thì không ai có đủ thời gian và kiên nhẫn để thưởng thức tác phẩm của bạn hết. Họ sẽ chuyển sang trang khác ngay lập tức đấy!
Vì vậy điều tối quan trọng là nên thường xuyên kiểm trang tốc độ load trang, tính tương thích của app hay website trên nhiều thiết bị, kích cỡ màn hình khác nhau để đảm bảo rằng chúng luôn mang lại một trải nghiệm thống nhất cho khách hàng.
Có một sự thật mà nhiều lập trình viên phải đối mặt đó là sự nghiệp lập trình của họ sẽ tiến đến một cấp cao nhất và sau đó là sẽ bắt đầu đi lùi, chán code (Ngoại trừ những người thật sự đam mê code). Hôm nay, TopDev sẽ cung cấp cho bạn một số thông tin định hướng nghề nghiệp quan trọng mà bạn cần phải biết, từ đó bạn có thể biết trước tương lai mình cần gì cho bản thân.
Tương lai của một lập trình viên sẽ ra sao khi ngày càng lớn tuổi?
Roadmap sự nghiệp của một lập trình viên trông sẽ như thế nào?
Những lựa chọn trong sự nghiệp và những kỳ vọng về các lựa chọn đó là gì?
Mọi người đều cho rằng các lập trình viên về sau có thể trở thành người quản lý hoặc lãnh đạo. Nhưng nhiều lập trình viên không hiểu được kỳ vọng và yêu cầu công việc của một nhà quản lý.
Chắc chắn, tất cả chúng ta đều có những manager, việc trở thành một manager có ý nghĩa gì? Có những kỳ vọng gì? Và sự khác biệt giữa một manager cấp trung và leader cấp cao là gì?
Trong bài viết này, chúng tôi sẽ chỉ cho bạn một con đường sự nghiệp từ sự khởi đầu trong lĩnh vực kỹ thuật như một Junior Developer cho đến level cao nhất là trở thành một CTO (Giám đốc công nghệ).
Lưu ý: Sự nghiệp mỗi người mỗi khác, sự hướng dẫn này không thể phù hợp với tất cả mọi người. Nhiều bạn sẽ thích hợp với vai trò quản lý, ngược lại cũng rất nhiều bạn đam mê code, coi code là phải giải trí mỗi khi gặp bế tắc chẳng hạn. Có thể lúc bạn 22 tuổi bạn chỉ mong là được ngồi code và không thích việc quản lý, nhưng biết đâu lên 30 bạn lại bắt đầu chán code. Vì vậy hiểu và chọn lựa đúng sẽ tránh cho chúng ta hụt hẫng khi gặp phải vài trục trặc trên con đường sự nghiệp.
1.Fresher
Fresher là để chỉ những sinh viên học ngành công nghệ thông tin mới ra trường, những người mới bắt đầu bước chân vào công việc của lập trình viên. Fresher là những người đã trang bị đầy đủ kiến thức căn bản cần có, kiến thức về các logic, cấu trúc phần mềm, cơ sở dữ liệu… Và cần một môi trường để thực hiện, triển khai, học hỏi và phát triển lên các kỹ năng chính và kỹ năng mềm. Bạn có thể xem thêm Fresher là gì tại đây.
2.Junior Developer
0-2 năm kinh nghiệm. Thường là người trải qua giai đoạn intern và fresher, đã có kinh nghiệm trong việc lập trình ứng dụng trên thực tế.
Hiểu biết sơ bộ về toàn bộ một vòng đời ứng dụng, sử dụng ngôn ngữ lập trình hay framework.
Hiểu biết về cơ sở dữ liệu, lưu trữ và xuất dữ liệu. Lúc này có thể viết các chức năng cho ứng dụng, tuy nhiên code sẽ có rác nhiều do chưa có kinh nghiệm tối ưu dẫn để việc chồng chéo trong việc truy xuất dữ liệu. Lúc này đôi khi code dở sẽ dẫn đến tốn resource server rất nhiều.
Khi bạn bắt đầu bước chân vào sự nghiệp lập trình, nó chắc chắn đầy khó khăn và dễ khiến bạn nản lòng. Có lúc bạn cảm thấy độ hiểu biết kiến thức của mình chưa đủ để đáp ứng cho công việc, không chắc chắn về việc làm thế nào mà người ta có thể viết ra những ứng dụng lớn và phức tạp đến như vậy. Và đôi khi, bạn lại tự hỏi tại sao mình vẫn chưa lên được cấp độ Senior. Bạn nhìn vào các lập trình viên senior khác và nghĩ rằng về cơ bản thì bạn cũng đang làm công việc giống như họ.
Điểm yếu của junior đương nhiên chính là kinh nghiệm, ngay cả nhưng bạn thông minh và học hỏi nhanh cũng chưa được tiếp xúc đến các chức năng hay code cũng như vấn đề hóc búa. Cho nên để giải quyết các vấn đề trên bạn cần tiếp tục kiên trì học hỏi, tự xây dựng cho mình một sản phẩm tương tự để có thể giải quyết các vấn đề cơ bản một cách gọn gàng, khi ấy leader của bạn sẽ thấy bạn đủ vững để truyền kinh nghiệm và giao cho bạn cách giải quyết vấn đề khó hơn.
3.Senior developer
3-8+ năm kinh nghiệm
Có thể xử lý các vấn đề phức tạp, viết ứng dụng lớn
Có khả năng thiết kế các cấu trúc cơ sở dữ liệu lớn, các tính năng phức tạp của ứng dụng
Hiểu biết sâu sắc về cơ sở dữ liệu và các dịch vụ ứng dụng (queues, caching, v.v…)
Lập trình viên ở level senior là những người thực sự quan trọng trong việc xây dựng toàn bộ các ứng dụng ở quy mô lớn. Lên đến level này, bạn sẽ đứng trước hai hướng đi của sự nghiệp. Một là khi bạn hiểu công nghệ đủ để trở thành một lập trình viên senior, thì bạn có thể đã có những kinh nghiệm kỹ thuật đủ sâu để trở thành một technical leader hoặc CTO (Giám đốc công nghệ) của một startup, tuy nhiên lúc này bạn phải học hỏi thêm về quản lý con người, quản lý một quy trình phát triển phần mềm…
Ngược lại bạn sẽ tiếp tục đào sâu kiến thức kỹ thuật, đam mê giải quyết những vấn đề về hệ thống lớn, chịu tải cao, nói chung là bạn không thích dây dưa vào việc quản lý con người.
4.Tech lead
5-10+ năm kinh nghiệm lập trình
Có các kỹ năng của một senior
Hiểu đủ sâu và rộng về các công nghệ, chọn cho team dev một hay nhiều tech stack để giải quyết vấn đề trong hệ thống lớn.
Đến level này, bạn sẽ có rất nhiều quyết định quan trọng để mọi lập trình viên trong team đi theo, nào là chọn ngôn ngữ gì, chọn tools gì, thiết kế hệ thống ra sao, theo chuẩn quy trình làm phần mềm nào.
Lúc này có đôi khi bạn sẽ code những định nghĩa, những quy luật đặt biến chẳng hạn, tuy nhiên công việc chính thường là thiết kế hệ thống va đảm bảo hệ thống có thể scale lớn, có thể kết hợp nhiều tech stack để vận hành đáp ứng nhu cầu.
5.Quản lý cấp trung
Chức danh này thường là Product Manager hoặc Project Manager
Là người quyết định rất lớn đế những chức năng cần phải có của một sản phẩm thông qua nghiên cứu, khảo sát và đo đạc.
Sau hàng năm trời còng lưng ra code bạn đã cảm thấy vị trí của mình trở nên nhàm chán và công việc quá nặng nề. Trong khi bạn bị việc rượt đuổi thì PM của bạn suốt ngày đi vòng quanh hối thúc. Bạn cảm thấy stress và bất công, bạn nghĩ nếu PM là “người đi hối” thì bạn cũng làm được. “Phải trở thành PM ngày bây giờ mới được!” – Bạn quyết tâm như vậy.
Và đúng là như vậy, khi đã trở thành một PM bạn sẽ không cần phải code nữa. Nhưng bù lại cho việc đó, bạn có “cả tá” việc phải thực hiện, và trách nhiệm của bạn cũng “cao ngất trời”. Xem thêm PM là gì và làm sao để trở thành Product Manager thành công tại đây.
6.Quản lý cấp cao
CTO hoặc CEO
Đến lúc này bạn sẽ trở thành một người truyền cảm hứng, dẫn dắt các leader và team đi theo một vision nào đó. Bạn ở nấc thang sự nghiệp đỉnh cao này, thì bạn càng ít tiếp xúc với công việc lập trình. Điều quan trọng nhất lúc này là về con người.
Các nhà quản lý cấp trung (mid-level manager) vẫn có thể có thời gian để vọc vạch với công nghệ, nhưng các quản lý cấp cao phải dành tất cả thời gian của họ để tập trung vào vấn đề con người: truyền cảm hứng, tạo động lực, lãnh đạo, và ra chiến lược.
Kết luận
TopDev hy vọng bài viết này đã cho bạn một số hướng dẫn và những hiểu biết để bạn có thể chuẩn bị cho tương lai phía trước. Như đã nói từ đầu, không phải ai cũng phù hợp, điều quan trọng là bạn thích làm gì và đừng bỏ cuộc. Luôn có những lập trình viên lớn tuổi nhưng vẫn code miệt mài vì đam mê, luôn có những tài năng trẻ lên làm lãnh đạo, quan trọng hơn hết là thấy yêu công việc mình đang làm.
Theo khảo sát của Stack Overflow Developer mới nhất, Full-Stack Web Development vẫn là xu hướng phổ biến nhất hiện nay. Không có gì ngạc nhiên khi có hàng tá các chương trình đào tạo online và offline giúp đỡ mọi lập trình viên trở thành Fullstack Developer và thậm chí sau đó còn hỗ trợ các developer mới này có được công việc lập trình với thu nhập cao.
Trong bài viết này, tôi sẽ cung cấp các guideline hướng dẫn những kỹ năng quan trọng nhất cần thiết để trở thành một Full-Stack Web Developer.
Fullstack developer là gì?
Fullstack developer là sự tổng hợp từ kiến thức, sự hiểu biết trực quan và sâu sắc về cả front-end và back-end, cũng như nắm vững các best practices và khái niệm. Đương nhiên, các full stack developer đều có khả năng code cho mọi thành phần của hệ thống, và họ sẽ làm mọi thứ một cách tốt nhất nếu họ thực sự giỏi. Điều này đòi hỏi một lượng lớn các kỹ năng cũng như kinh nghiệm.
Full stack developer làm những gì?
Một Full-Stack Web Developer là người có thể làm việc trên cả front-end và back-end của một ứng dụng. Front-end nói chung là phần mà người dùng có thể thấy được và tương tác được, còn back-end là phần ứng dụng xử lý logic, tương tác cơ sở dữ liệu, chứng thực người dùng, cấu hình máy chủ, vv.
Tuy nhiên thì một full stack developer xử lý frontend sẽ không thể bằng một chuyên gia front-end được, điều này cũng tương tự với backend. Họ sẽ có sự hiểu biết rộng về nhiều thành phần khác nhau, và cách tương tác giữa chúng trong quá trình phát triển, và kết hợp chúng lại với nhau thành một sản phẩm hoàn chỉnh.
Là 1 Full-Stack Web Developer, không nhất thiết bạn phải làm tốt mọi công việc được giao từ front-end đến back-end, nhưng điều đó có nghĩa là bạn có thể làm việc trên cả hai front-end và back-end và hiểu điều gì đang xảy ra khi xây dựng một ứng dụng.
Nếu bạn muốn trở thành một Full-Stack Web Developer hay có dự định bắt đầu công việc Full-Stack Web Developer thì dưới đây là list tham khảo những điều dân IT nên học.
1. HTML/CSS
Hầu như mọi chương trình dạy online hay offline về Full-Stack Web Developer, đều dạy cho bạn bắt đầu với HTML và CSS bởi vì chúng là những nền tảng của web. HTML cho phép bạn thêm nội dung vào một trang web và CSS cho phép bạn tạo phong cách riêng cho nội dung của bạn.
Các topic dưới đây liên quan đến HTML / CSS thường xuất hiện trong các cuộc phỏng vấn và liên quan trực tiếp đến công việc thực tế khi bạn đi làm:
Định nghĩa HTML .
Có thể giải thích CSS Box Model.
Lợi ích của tiến trình tiền xử lý CSS (bạn không nhất thiết phải hiểu cách sử dụng nó ở mức độ sâu, nhưng bạn phải hiểu chúng là gì và chúng giúp ích gì cho developer).
CSS Media Queries nhắm mục tiêu vào các thiết bị khác nhau và cung cấp các CSS tương ứng.
Bootstrap (một framework hỗ trợ thiết kế và bố trí nội dung trên một trang. Trong khi nhiều chương trình online hay các trường học lại chỉ tập trung vào việc dạy Bootstrap, trong khi thực tế điều quan trọng hơn là phải có kiến thức sâu về CSS cơ bản hơn là tìm hiểu các tính năng và phương pháp Bootstrap cụ thể).
2. JavaScript
Ngôn ngữ JavaScript đang ngày càng trở nên phổ biến hơn qua các năm. Các libraries, framework và tool mới liên tục được phát hành. Dựa trên khảo sát của Stack Overflow Developer, JavaScript là ngôn ngữ phổ biến nhất trong cả Full-Stack, Front-end, and Back-end.
Đây là ngôn ngữ duy nhất chạy tự nhiên trong trình duyệt và cũng có thể tăng gấp đôi hiệu suất so với ngôn ngữ máy chủ (như bạn sẽ thấy bên dưới với Node.js). Dưới đây là một số topics bạn cần phải hiểu nếu muốn trở thành Full-Stack Developer
Hiểu cách làm việc với DOM, biết JSON là gì và làm thế nào để ứng dụng nó.
Các tính năng ngôn ngữ quan trọng như: functional composition, prototypal inheritance, closures, event delegation, scope, chức năng bậc cao
Điều khiển bất đồng bộ, promises hay async/await và callbacks
Cách cấu trúc code của bạn đúng chuẩn và mô đun hóa các phần của nó, những thứ như webpack, browserify, hoặc các build tool như gulp chắc chắn sẽ hữu ích cho bạn
Biết cách sử dụng ít nhất một framework phổ biến (nhiều chương trình chỉ tập trung chủ yếu vào việc giảng dạy cho bạn một library hoặc 1 framework như React hay AngularJS, nhưng trong thực tế, việc hiểu sâu hơn về ngôn ngữ JavaScript không phụ thuộc quá nhiều vào các tính năng đặc biệt của framework. Một khi bạn có một sự hiểu biết tốt về JavaScript, việc tiếp cận các framework không còn quá khó khăn.
Mặc dù một số ý kiến cho rằng bạn nên hạn chế sử dụng hoặc không sử dụng jQuery code. Tuy nhiên không thể phủ nhận jQuery code vẫn tồn tại trong hầu hết các ứng dụng và hiểu biết về nó chắc chắn sẽ hữu ích cho bạn.
Một số kiến thức về testing frameworks và tại sao chúng lại quan trọng (một số thậm chí có thể cho rằng chủ đề này nên là tùy chọn).
Tìm hiểu về một số tính năng mới quan trọng của ES6
3. Back-End Language
Một khi bạn cảm thấy mình nắm bắt tốt về HTML / CSS và JavaScript, bạn sẽ muốn chuyển sang ngôn ngữ back-end sẽ xử lý những thứ như hoạt động của cơ sở dữ liệu, xác thực người dùng và logic ứng dụng.
Tất cả các chương trình đào tạo trực tuyến và bootcamps thường tập trung vào một ngôn ngữ back-end cụ thể, trong khi thực tế không có vấn đề gì khi bạn học nhiều hơn 1 ngôn ngữ miễn là bạn hiểu những gì đang xảy ra và bạn hiểu được bản chất ngôn ngữ mà bạn học.
Bạn sẽ nhận được những phản ứng khác nhau khi hỏi ai đó ngôn ngữ back-end nào là tốt nhất để học.Vì vậy dưới đây tôi đã liệt kê một vài kết hợp phổ biến. Một lưu ý quan trọng: dù cho bạn quyết định học ngôn ngữ gì, thì điều quan trọng là phải gắn bó với nó và học hỏi mọi thứ về nó trong khả năng của bạn
Node.js: Đây là một lựa chọn tuyệt vời bởi vì Node.js chính nó chỉ là một environment JavaScript có nghĩa là bạn không cần phải học một ngôn ngữ mới. Đây là một lý do tại sao nhiều chương trình online và bootcamps chọn dạy Node.js . Framework phổ biến nhất mà bạn có thể tìm hiểu để trợ giúp bạn trong việc phát triển các ứng dụng web là Express.
Php: không phải bàn cãi nhiều, Php vẫn đang được lập trình viên ở Việt Nam cũng như các công ty IT tại VN sử dụng nhiều trong các production lớn. Nổi tiếng nhất và dễ học nhất là Laravel.
Ruby: Một số framework phổ biến để phát triển trong Ruby là Rails và Sinatra. Rất nhiều chương trình dạy Ruby như là một ngôn ngữ back-end đầu tiên.
Python: Một số framework phổ biến để phát triển trong Python là Django và Flask.
Java: Ngôn ngữ Java không còn được dạy nhiều trong thời gian gần đây khi đào tạo Full-Stack Web Development nhưng một số công ty lại sử dụng Java như một phần của họ và nó vẫn là một ngôn ngữ lập trình rất cần thiết (xem hình trên).
4. Databases & Web Storage
Khi học để xây dựng các ứng dụng web, trong một số trường hợp có thể bạn sẽ muốn lưu trữ dữ liệu một nơi nào đó và sẽ sử dụng nó sau này. Bạn cần nắm vững các topic sau đây liên quan đến cơ sở dữ liệu và lưu trữ.
Hiểu được các lợi ích của dữ liệu quan hệ, ví dụ: MySQL.
Hiểu được điều gì là tốt hơn trong những tình huống nhất định.
Biết cách kết nối cơ sở dữ liệu với ngôn ngữ back-end mà bạn đã chọn (ví dụ: Node.js + MongoDB).
Hiểu được lợi ích của các kho dữ liệu trong bộ nhớ như Redis hoặc memcached.
Bộ lưu trữ web để lưu trữ sessions, cookie và cached data trong trình duyệt.
Cơ sở dữ liệu nhân rộng, ACID, và ORM (tất cả tùy chọn).
5. HTTP & REST
HTTP là một giao thức ứng dụng phi văn bản trên Internet – nó cho phép client giao tiếp với servers (ví dụ: mã JavaScript của bạn có thể yêu cầu AJAX cho một số mã back-end bạn đã chạy trên một máy chủ sẽ xảy ra thông qua HTTP). Một số topic quan trọng bạn nên tìm hiểu được liệt kê dưới đây:
REST là gì và tại sao lại quan trọng trong giao thức HTTP và các ứng dụng web.
Best practices để thiết kế RESTful API. POST / GET yêu cầu.
Học cách sử dụng Chrome DevTools có thể cực kỳ hữu ích.
Giấy chứng nhận SSL là gì?
HTTP / 2 & SPDY (tùy chọn). WebSockets, Web Workers, và Service Workers (tất cả các tùy chọn).
6. Cấu trúc ứng dụng web
Một khi bạn nghĩ rằng bạn mình đã nắm bắt về HTML / CSS, JavaScript, lập trình back-end, cơ sở dữ liệu, và HTTP / REST, tiếp theo sẽ là phần khó khăn hơn. Tại thời điểm này nếu bạn muốn tạo ra một ứng dụng web phức tạp, bạn cần phải biết cách cấu trúc code của bạn, cách tách các tệp tin, vị trí lưu trữ các tệp tin lớn, cách sắp xếp dữ liệu trong cơ sở dữ liệu của bạn, nơi thực hiện một số nhiệm vụ tính toán (client-side vs server-side) và nhiều thứ khác nữa.
Có những best practices mà bạn có thể đọc online, nhưng cách tốt nhất để thực sự học về cấu trúc ứng dụng là tự làm một ứng dụng lớn có chứa một số bộ phận chuyển động – hoặc thậm chí tốt hơn là làm việc với một nhóm và cùng phát triển 1 ứng dụng lớn/ phức tạp.
Đó là lý do tại sao người có 7 năm kinh nghiệm thể làm tốt hơn người có 2 năm kinh nghiệm, dù họ không nhất thiết phải biết CSS hoặc JavaScript nhưng qua quá trình làm việc tích lũy kinh nghiệm họ có thể làm việc với tất cả các loại ứng dụng và trang web khác nhau và đã học được cách để thiết kế và xây dựng cấu trúc ứng dụng (trong khi học những thứ quan trọng khác) có thể mang lại hiệu quả tốt nhất và hình dung về bức tranh toàn cảnh nhất khi phát triển ứng dụng. Dưới đây là một số điều bạn có thể đọc để giúp bạn tìm hiểu cách kiến trúc các ứng dụng web của bạn hiệu quả:
Tìm hiểu về các platforms thông dụng như một dịch vụ, ví dụ: Heroku và AWS. Heroku cho phép bạn dễ dàng upload code của mình lên và chạy ứng dụng với cấu hình thấp hoặc bảo trì máy chủ và AWS cung cấp hàng chục sản phẩm và dịch vụ lưu trữ, xử lý video, cân bằng tải và nhiều hơn thế nữa.
Tối ưu hóa cho các ứng dụng và trình duyệt hiện đại.
Một số ý kiến về cấu trúc ứng dụng web cần có bao gồm.
Thiết kế các ứng dụng web của Microsoft.
MVC.
Mặc dù điều quan trọng nhất là bạn nên cố gắng làm project với mọi người, hãy xem xét codebases của các dự án phổ biến trên GitHub và tìm hiểu càng nhiều càng tốt từ các senior developers.
7. Git
Git là một hệ thống kiểm soát phiên bản cho phép các developer làm việc trên một nhóm để theo dõi tất cả các thay đổi đang được thực hiện trên codebase. Điều quan trọng là cần cso một vài hiểu biết cơ bản liên quan đến Git để bạn hiểu cách nhận ra code mới nhất mà bạn đã bỏ lỡ, cập nhật các phần của code, sửa lỗi và thay đổi code của người khác mà không vi phạm điều gì. Bạn chắc chắn nên học ý nghĩa đằng sau Git và “chơi” với nó nhiều hơn
Danh sách một số lệnh Git phổ biến mà bạn có thể sử dụng
Hướng dẫn sử dụng Git và Github cho người mới bắt đầu
8. Thuật toán cơ bản và cấu trúc dữ liệu
Topic này tập trung vào 2 quan điểm phân cực trong giới lập trình. Có một số developer cho rằng không nên tập trung nhiều vào các chủ đề khoa học máy tính như tree traversal, sorting, phân tích thuật toán, thao tác ma trận, etc vv trong phát triển web.
Trong khi bên cạnh những công ty yêu cầu ứng viên có bằng khoa học máy tính hoặc tương đương, thì cung có rất nhiều công ty sẽ chọn tuyển dụng những người không có bằng cấp kỹ thuật này nếu họ có thể chứng minh rằng họ biết cách phát triển các ứng dụng và thể hiện sự hiểu biết về các vấn đề cần giải quyết.
Tuy nhiên để trở thành một senior fullstack developer, chúng ta cần ít nhất là nắm các thuật toán cơ bản và cấu trúc dữ liệu, việc là sẽ giảm thiểu code rác hay tăng performance hệ thống. Vì vậy, đây là một số điều bạn chắc chắn nên học:
Cấu trúc dữ liệu hash tables và cố gắng hiểu chúng ở mức độ chuyên sâu. Cấu trúc dữ liệu này nằm dưới các đối tượng trong JavaScript (dictionaries trong Python và hashes trong Ruby).
Hiểu về sơ đồ cây và đồ thị có thể có lợi như hiểu cấu trúc dữ liệu.
Hiểu được các kiến thức cơ bản của phân tích Big-O, để bạn không làm những điều ngớ ngẩn như tạo ra một vòng lặp 3 lần không cần!
Biết khi sử dụng một đối tượng với một mảng và hiểu được sự cân bằng.
Tìm hiểu tại sao bộ nhớ đệm lại quan trọng như vậy khi làm việc với một lượng lớn dữ liệu. Cũng tìm hiểu những ưu nhược điểm của bộ nhớ trong vs bộ nhớ ngoài
Tìm hiểu sự khác nhau giữa queues với stacks.
Sẽ rất khó để học hỏi tất cả những điều này, nhưng phần thưởng cuối cùng là vô cùng xứng đáng.
Ở tuổi 13, Michael Sayman đã tạo ra ứng dụng điện thoại thông minh đầu tiên của mình. 17 tuổi được Facebook mời về thực tập và sau trở thành nhân viên chính thức. Và bây giờ cậu ấy 21 tuổi, là một triệu phú và đang làm việc tại Google về các sản phẩm Assistant của hãng.
“Thật điên rồ, vì tôi chưa từng nghĩ rằng là mình lại có thể đạt được bất cứ điều gì đã xảy ra”, Sayman nói “Tất cả cứ như thể chỉ là một giấc mơ”
Mặc dù cuộc sống của Michael Sayman có vẻ tuyệt vời, nhưng cuộc hành trình của cậu lại vô cùng khó khăn.
Khi cuộc suy thoái năm 2008 xảy ra, Sayman phải giúp gia đình trả các hóa đơn – với số tiền kiếm được từ việc thiết kế ứng dụng. Cũng chính tuổi thơ đầy khó khăn ấy đã giúp Sayman học được nhiều bài học giúp ích cho con đường sự nghiệp sau này của cậu ấy.
Bạn không cần phải là một thiên tài – chỉ cần chủ động
Michael Sayman đã tự học code qua các video hướng dẫn trên Google. Cậu bắt đầu xây dựng ứng dụng, bán chúng và tìm mọi cách để kiếm tiền trang trải cho cuộc sống gia đình lúc đó đang lâm vào cảnh khó khăn do suy thoái kinh tế.
Khi Zuckerberg gọi Sayman về làm thực tập tại Facebook, Sayman đã tạo ra một ứng dụng trò chơi miễn phí được gọi là 4 Snaps vô cùng nổi tiếng khi đứng đầu bảng App Store của Apple, đánh bại các ứng dụng đình đám như Starbucks và Fitbit.
Đừng mong ai đó sẽ mang thành công đến cho bạn
“Điều lớn nhất tôi nghĩ rằng mình đã học được là không bao giờ dựa dẫm vào bất cứ ai cho sự thành công của bản thân” – Sayman nói – “Bất kể là ai hay trường hợp như thế nào đi nữa – không bao giờ để kì vọng ai đó sẽ hay điều gì đó có thể giúp mình có được thành công”
Khó khăn không phải là trở ngại mà là động lực để vươn lên
Khi Sayman bắt đầu kiếm tiền từ các ứng dụng của mình ở tuổi 13 (khoảng $100 ~ $200/ngày) cũng là lúc cậu phải trở thành trụ cột kinh tế cho gia đình khi mới chỉ ở lứa tuổi thiếu niên. Giai đoạn đó thực sự là quãng thời gian khó khăn những Sayman nói rằng anh rất tự hào với gia cảnh: ” Tôi đã có thể học được rất nhiều từ áp lực phải trở thành trụ cột gia đình, ở cái độ tuổi còn quá trẻ ấy. Điều đó thực sự giúp tôi trường trành rất nhiều”
Chấp nhận mạo hiểm
Mặc dù Facebook “giống như gia đình” với Sayman, cậu vẫn quyết định tới Google để buộc mình phải nỗ lực và liên tục có động lực phát triển, anh nói.
“Cho dù quyết định này có thể không thành công, tôi vẫn sẽ học hỏi nhiều điều ở đó” anh nói “Nhưng bất kể chuyện gì xảy ra, nó sẽ là một trải nghiệm mà tôi chưa từng có trước đây.”
Học hỏi liên tục, không ngừng cải thiện bản thân
Sayman luôn tự nhắc bản thân rằng mình không phải là một thiên tài và cũng không đặc biệt.
“… Có hàng triệu đứa trẻ ngoài kia thông minh hơn tôi, những người biết cách viết code tốt hơn tôi từng làm, những nhà thiết kế giỏi hơn, kỹ sư giỏi hơn và họ lại không có được những gì tôi có”, Sayman nói.
Sayman luôn tự nhắc nhở bản thân phải luôn không ngừng nỗ lực, làm mới mình mỗi ngày
Node.js được xây dựng dựa trên JavaScript runtime. Nghe thật tuyệt, nhưng bạn đã thật sự hiểu chi tiết Node.js là gì? Nó hoạt động như thế nào? Cùng TopDev tìm hiểu từ A-Z về NodeJS trong bài viết dưới đây!
Node.js là gì?
Node.js là gì?
NodeJS là một nền tảng được xây dựng trên “V8 Javascript engine” được viết bằng c++ và Javascript. Nền tảng này được phát triển bởi Ryan Lienhart Dahl vào năm 2009.
Node.js là một môi trường thực thi JavaScript nguồn mở và đa nền tảng.
Ghi chú: Trong quá trình nghiên cứu tìm hiểu về Node.js, bạn sẽ bắt gặp rất nhiều cách viết khác như nodejs, nodeJS hay node js, các cách viết này đều được hiểu là đang nói về Node.js.
Node.js ra đời khi các developer đời đầu của JavaScript mở rộng nó từ một thứ bạn chỉ chạy được trên trình duyệt thành một thứ bạn có thể chạy trên máy của mình dưới dạng ứng dụng độc lập.
Nguồn mở (Open-source): Mã nguồn của Node.js được công bố công khai, điều này có nghĩa là bất kỳ ai cũng có thể truy cập, sử dụng, và đóng góp vào mã nguồn. Node.js được duy trì bởi cộng đồng lập trình viên trên toàn thế giới, và hướng dẫn đóng góp của Node.js hướng dẫn bạn cách để bạn có thể góp phần phát triển nó.
Đa nền tảng (Cross-platform): Node.js không phụ thuộc vào bất kỳ hệ điều hành nào cụ thể nào, nghĩa là nó có thể chạy trên Linux, macOS hoặc Windows. Điều này làm cho Node.js trở thành một lựa chọn linh hoạt cho các nhà phát triển muốn xây dựng các ứng dụng có thể hoạt động trên nhiều nền tảng khác nhau mà không cần thay đổi mã nguồn.
Môi trường thực thi JavaScript (JavaScript runtime environment): Để mã JavaScript có thể được thực thi, nó cần một môi trường chạy phù hợp. Trong khi trình duyệt như Chrome và Firefox cung cấp một môi trường thực thi cho JavaScript, Node.js mở rộng khả năng này ra ngoài trình duyệt. Node.js cho phép chạy JavaScript trên máy chủ, hoặc trong bất kỳ môi trường máy tính nào khác, không chỉ trong trình duyệt.
Dựa trên V8 JavaScript Engine: Node.js được xây dựng dựa trên V8, động cơ JavaScript được phát triển bởi Google cho trình duyệt Chrome. Điều này giúp Node.js có khả năng thực thi JavaScript nhanh và hiệu quả, đồng thời hỗ trợ các tính năng mới nhất của ngôn ngữ JavaScript.
Node.js đã mở rộng khả năng của JavaScript từ việc chỉ phát triển front-end trong trình duyệt để bao gồm cả phát triển back-end. Điều này có nghĩa là các lập trình viên có thể sử dụng cùng một ngôn ngữ lập trình, JavaScript, để phát triển toàn bộ ứng dụng, từ front-end đến back-end, qua đó tạo điều kiện cho việc học tập và phát triển ứng dụng nhanh chóng và hiệu quả hơn.
JavaScript giờ có khả năng làm những thứ và những ngôn ngữ lập trình scripting như Python có thể làm.
Node.js hoạt động dựa trên một số nguyên tắc cơ bản giúp nó hiệu quả trong việc xử lý các ứng dụng có nhiều hoạt động nhập/xuất (I/O) mà không bị chặn, đồng thời giảm đáng kể sự phức tạp trong quản lý các luồng thực thi. Dưới đây là một số thành phần chính giải thích cách thức hoạt động của Node.js:
Kiến trúc Non-blocking I/O và Event-Driven:
Node.js sử dụng một mô hình non-blocking I/O (input/output) và event-driven, nghĩa là các hoạt động như đọc file, truy vấn cơ sở dữ liệu, hoặc giao tiếp mạng được thực hiện mà không chặn tiến trình chính. Điều này cho phép xử lý nhiều yêu cầu cùng lúc mà không cần tạo nhiều luồng (thread), giúp giảm bớt chi phí liên quan đến quản lý luồng và tối ưu hóa hiệu suất.
Khi một hoạt động I/O được khởi tạo, nó sẽ được gửi đến thực thi trong hệ thống hoặc cơ sở dữ liệu mà không làm chậm tiến trình chính. Sau khi hoạt động hoàn tất, một sự kiện sẽ được phát đi và xử lý bằng các hàm gọi lại (callback).
V8 JavaScript Engine
Node.js được xây dựng trên động cơ JavaScript V8 của Google Chrome, đây là một động cơ rất nhanh cho phép biên dịch mã JavaScript thành mã máy để thực thi trực tiếp trên phần cứng, làm tăng hiệu suất thực thi.
Single-Threaded
Mặc dù Node.js hoạt động trên một luồng duy nhất cho logic ứng dụng của người dùng, nó vẫn sử dụng nhiều luồng ở tầng thấp hơn thông qua thư viện libuv để xử lý các hoạt động I/O. Tuy nhiên, những chi tiết này được ẩn giấu khỏi người dùng, giúp việc lập trình đơn giản hơn mà vẫn đảm bảo hiệu suất.
Event Loop
Trái tim của Node.js là “event loop”. Đây là vòng lặp sự kiện mà ở đó Node.js tiếp tục lắng nghe sự kiện và thực hiện các hàm gọi lại khi một sự kiện được kích hoạt. Vòng lặp sự kiện cho phép Node.js xử lý hàng nghìn kết nối đồng thời mà không cần phải tạo ra chi phí quản lý luồng.
Trigger Callback
Khi thao tác I/O hoàn tất, hệ điều hành thông báo cho Node.js, và Node.js sau đó thực thi hàm callback tương ứng để xử lý kết quả hoặc tiếp tục xử lý logic.
NPM (Node Package Manager)
NPM là hệ thống quản lý gói cho Node.js, cho phép các nhà phát triển dễ dàng chia sẻ và sử dụng mã nguồn từ nhau. NPM là một trong những kho lưu trữ mã nguồn mở lớn nhất thế giới và chứa hàng ngàn module có thể được tích hợp vào ứng dụng của bạn.
Tổng hợp lại, Node.js mang đến một mô hình hiệu quả và mạnh mẽ cho các ứng dụng web và máy chủ, nhờ khả năng xử lý đồng thời nhiều hoạt động I/O mà không bị chặn, và qua đó tối ưu hóa việc sử dụng tài nguyên và cải thiện hiệu suất.
Require
Require làm 3 thứ:
Tải module đi kèm với Node.js như hệ thống file và HTTP từ Node.js API.
Tải thư viện thứ 3 như Express và Mongoose mà bạn cài đặt từ npm.
Giúp bạn require file của bạn và mo-đun hoá project.
Require là 1 chức năng, và nó nhận tham số path tinh chỉnh và trả về module.export.
Thành phần của Node.js
Bây giờ, chúng ta hãy cùng tìm hiểu từng phần của Node.js để hiểu rõ hơn về nền tảng phía máy chủ nói chung.
Module
Module giống như thư viện JavaScript có thể được sử dụng trong ứng dụng Node.js để bao gồm một tập hợp các hàm. Để bao gồm một module trong ứng dụng Node.js, hãy sử dụng hàm require() với dấu ngoặc đơn chứa tên của module.
const http = require("http");
Tham khảo một số Node.js Module:
Danh sách Node.js Module
Console
Console là một module cung cấp phương pháp gỡ lỗi tương tự như console JavaScript cơ bản do trình duyệt internet cung cấp. Nó in thông báo ra stdout và stderr.
console.log('hello world')
Cluster
Node.js được xây dựng dựa trên khái niệm lập trình đơn luồng. Cluster là một mô-đun cho phép đa luồng bằng cách tạo các tiến trình con chia sẻ cùng một cổng máy chủ và chạy đồng thời.
Có thể thêm cụm vào ứng dụng theo cách sau:
const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length; // Get the number of CPU coresif (cluster.isMaster) {
console.log(`Master ${process.pid} is running`);
// Fork workers for each CPUfor (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', (worker, code, signal) => {
console.log(`Worker ${worker.process.pid} died`);
console.log('Forking a new worker');
cluster.fork(); // Fork a new worker if one dies
});
} else {
// Workers can share any TCP connection// In this case, it is an HTTP server
http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Hello World\n');
}).listen(8000);
console.log(`Worker ${process.pid} started`);
}
Global
Các đối tượng toàn cục trong Node.js có sẵn trong tất cả các mô-đun. Các đối tượng này là hàm, mô-đun, chuỗi, v.v. Một số đối tượng toàn cục của Node.js được đề cập trong bảng dưới đây:
Đối tượng toàn cục
Mô tả
global
Đối tượng toàn cục chung, tương tự như window trong trình duyệt.
process
Cung cấp thông tin và điều khiển về quá trình thực thi Node.js.
console
Cung cấp các phương thức để ghi log thông tin, lỗi và các thông báo khác.
Buffer
Lớp toàn cục giúp làm việc với các dữ liệu nhị phân (binary data).
setTimeout
Lên lịch thực thi một hàm sau một khoảng thời gian nhất định.
clearTimeout
Hủy một hàm đã được lên lịch bởi setTimeout.
setInterval
Lên lịch thực thi một hàm nhiều lần, với khoảng thời gian cố định giữa các lần thực thi.
clearInterval
Hủy một hàm đã được lên lịch bởi setInterval.
setImmediate
Thực thi một hàm ngay lập tức sau khi vòng lặp sự kiện hiện tại kết thúc.
clearImmediate
Hủy một hàm đã được lên lịch bởi setImmediate.
__dirname
Chứa đường dẫn tới thư mục của tệp hiện tại.
__filename
Chứa đường dẫn tuyệt đối tới tệp hiện tại.
module
Đối tượng liên quan đến mô-đun hiện tại, chứa thông tin về mô-đun.
require()
Hàm dùng để nhập các mô-đun khác vào tệp hiện tại.
Luồng (Streaming)
Luồng là các đối tượng cho phép bạn đọc dữ liệu hoặc ghi dữ liệu liên tục. Có bốn loại luồng:
Có thể đọc được: Đây là loại luồng mà dữ liệu có thể được đọc
Có thể ghi: Đây là loại luồng mà dữ liệu có thể được ghi vào
Duplex: Đây là cả luồng có thể đọc và ghi
Chuyển đổi: Các luồng có thể thao tác dữ liệu trong khi nó đang được đọc hoặc ghi
Đệm (Butter)
Buffer là một module cho phép xử lý các luồng chỉ chứa dữ liệu nhị phân. Một bộ đệm rỗng có chiều dài ’10’ có thể được tạo bằng phương pháp này:
var buf = Butter.alloc(10)
Miền (Domain)
Mô-đun miền chặn các lỗi vẫn chưa được xử lý. Có hai phương pháp được sử dụng để chặn các lỗi này:
Liên kết nội bộ: Trình phát lỗi thực thi mã của nó bên trong phương thức chạy
Liên kết bên ngoài: Bộ phát lỗi được thêm rõ ràng vào miền thông qua phương thức add của nó
DNS
Mô-đun DNS được sử dụng để kết nối với máy chủ DNS và thực hiện phân giải tên bằng phương pháp sau:
dns.resolve()
Mô-đun DNS cũng được sử dụng để thực hiện phân giải tên mà không cần kết nối mạng bằng cách sử dụng phương pháp sau:
dns.lookup()
Trình gỡ lỗi
Node.js bao gồm một tiện ích gỡ lỗi có thể được truy cập bằng một trình gỡ lỗi tích hợp. Trình gỡ lỗi Node.js không có nhiều tính năng nhưng hỗ trợ kiểm tra mã đơn giản. Trình gỡ lỗi có thể được sử dụng trong thiết bị đầu cuối bằng cách sử dụng từ khóa ‘inspect’ trước tên tệp JavaScript. Để kiểm tra tệp — ví dụ: myscript.js—bạn có thể làm theo phương pháp này:
$ node inspect myscript.js
Tại sao nên sử dụng Node.js?
Dưới đây là một số lý do chính tại sao nhiều lập trình viên lại ưu tiên lựa chọn Node.js:
Hiệu suất cao: Node.js được xây dựng trên động cơ JavaScript V8 của Google Chrome, cho phép biên dịch mã JavaScript thành mã máy nhanh chóng. Nhờ đó, thời gian thực thi của Node.js rất nhanh, làm tăng hiệu suất của các ứng dụng.
Hệ sinh thái phong phú: Với hơn 50,000 gói có sẵn trong Node Package Manager (NPM), các nhà phát triển có thể dễ dàng tìm và sử dụng các thư viện theo nhu cầu của họ mà không cần phải viết lại từ đầu, tiết kiệm đáng kể thời gian và công sức.
Xử lý bất đồng bộ và không chặn (Asynchronous and Non-blocking): Node.js hoạt động một cách bất đồng bộ và không chặn các hoạt động I/O, nghĩa là nó không cần chờ đợi API trả về dữ liệu trước khi tiếp tục xử lý yêu cầu tiếp theo. Điều này làm cho Node.js trở nên lý tưởng cho việc xây dựng các ứng dụng web thời gian thực và xử lý dữ liệu lớn.
Tính nhất quán trong mã nguồn: Node.js cho phép sử dụng cùng một ngôn ngữ lập trình (JavaScript) cho cả phía máy chủ và máy khách. Điều này không chỉ giúp giảm thiểu sự không đồng bộ giữa client và server mà còn làm cho việc bảo trì và quản lý mã nguồn trở nên dễ dàng hơn.
Khả năng mở rộng: Node.js hỗ trợ xây dựng các ứng dụng có khả năng mở rộng cao thông qua mô hình sự kiện và bất đồng bộ của mình. Điều này cho phép xử lý hàng ngàn kết nối đồng thời mà không làm giảm hiệu suất.
Ngôn ngữ quen thuộc: Vì Node.js là một khung làm việc JavaScript, nó trở thành lựa chọn lý tưởng cho những nhà phát triển đã quen thuộc với JavaScript. Điều này làm cho quá trình học tập và phát triển dự án với Node.js trở nên dễ dàng hơn nhiều.
Nhờ những đặc điểm này, Node.js đã trở thành một trong những lựa chọn hàng đầu cho việc phát triển phía máy chủ, đặc biệt là trong các dự án yêu cầu hiệu suất cao và khả năng xử lý đồng thời lớn.
Ứng dụng của NodeJS
Node.js được sử dụng rộng rãi trong nhiều loại ứng dụng web và server do khả năng xử lý bất đồng bộ, hiệu suất cao, và hệ sinh thái phong phú của nó. Dưới đây là một số ứng dụng phổ biến của Node.js
Ứng dụng của Node.js
Ứng dụng Web Thời Gian Thực (Real-time Web Applications): Node.js là lựa chọn lý tưởng cho các ứng dụng web thời gian thực như trò chuyện trực tuyến và trò chơi trực tuyến do khả năng xử lý các sự kiện I/O một cách nhanh chóng và hiệu quả.
APIs Server-side: Node.js thường được sử dụng để xây dựng RESTful APIs do khả năng xử lý đồng thời lớn và tốc độ phản hồi nhanh, làm cơ sở cho các ứng dụng di động và web.
Streaming Data: Node.js hỗ trợ xử lý dữ liệu dạng stream, cho phép ứng dụng xử lý các tệp video, âm thanh hoặc các dữ liệu khác trong khi chúng vẫn đang được truyền, thay vì phải chờ cho đến khi toàn bộ tệp được tải về.
Ứng dụng Một Trang (Single Page Applications): Node.js phù hợp với việc phát triển các ứng dụng một trang (SPA) như Gmail, Google Maps, hay Facebook, nơi mà nhiều tương tác xảy ra trên một trang duy nhất mà không cần tải lại trang.
Công cụ và Tự Động Hóa: Node.js cũng được sử dụng để phát triển các công cụ dòng lệnh và các script tự động hóa quy trình làm việc, nhờ vào các gói NPM hỗ trợ đa dạng và khả năng tích hợp dễ dàng với các công nghệ khác.
Microservices Architecture: Node.js là một lựa chọn phổ biến cho kiến trúc microservices, nơi các ứng dụng lớn được chia thành các dịch vụ nhỏ, độc lập và dễ quản lý hơn.
Ứng dụng IoT (Internet of Things): Node.js thường được sử dụng trong các ứng dụng IoT, nơi cần xử lý một lượng lớn các kết nối đồng thời và các sự kiện từ các thiết bị IoT.
Dashboard và Monitoring: Node.js được sử dụng để xây dựng các dashboard hiển thị dữ liệu thời gian thực và các công cụ giám sát, giúp doanh nghiệp dễ dàng theo dõi hiệu suất và tình trạng của các hệ thống.
Node.js, với các ưu điểm như xử lý nhanh, mô hình bất đồng bộ và không chặn, đã trở thành công nghệ lựa chọn cho nhiều nhà phát triển và doanh nghiệp khi xây dựng các ứng dụng hiện đại và hiệu quả.
Cách cài đặt và sử dụng NodeJS
Hãy cùng xem cách bạn có thể tạo ứng dụng Node.js đầu tiên của mình. Phần này sẽ chỉ cho bạn cách chạy các tập lệnh Node.js từ dòng lệnh.
Cách tải xuống và cài đặt Node.js
Trước tiên, bạn cần tải xuống và cài đặt Node.js. Có nhiều cách khác nhau để bạn có thể thực hiện việc đó. Nếu bạn là người mới bắt đầu, tôi khuyên bạn nên tải xuống Node.js từ trang web chính thức (download node.js). Chọn phiên bản phù hợp với hệ điều hành của mình và tải xuống.
Cách kiểm tra phiên bản Node.js
Để kiểm tra phiên bản Node.js, hãy chạy lệnh node --version trong terminal của bạn.
Nếu cài đặt thành công, bạn sẽ thấy phiên bản Node.js bạn đã cài đặt. Bạn sẽ nhận được phản hồi như ảnh chụp màn hình bên dưới.
Cách kiểm tra phiên bản Node.js
Cách chạy Node.js từ dòng lệnh
Hãy cùng xây dựng một Hello World ứng dụng đơn giản.
Tạo một thư mục dự án mới. Bạn có thể gọi nó là my-project.Mở dự án trong trình soạn thảo mã của bạn. Bên trong thư mục, tạo một app.jstệp.
Thêm mã sau vàoapp.js
Cách chạy Node.js từ dòng lệnh
Như bạn có thể thấy, đây là mã JavaScript.
Bạn có thể chạy tập lệnh trong dòng lệnh bằng cách chạy lệnh node <fileName>. Trong trường hợp này, tên tệp là app.js.
Chạy lệnh sau trong terminal để thực thi Hello world.chương trình:
node app.js
Bạn sẽ thấy chuỗi “Hello world.” được ghi vào thiết bị đầu cuối của bạn như thế này.
Chương trình Node.js hoàn thành
Xin chúc mừng! Bạn vừa chạy ứng dụng Node.js đầu tiên của mình.
Chúng tôi biết rằng một bài đăng như thế này là không đủ để tìm hiểu tất cả những gì cần biết về Node.js. Nhưng hi vọng bài viết của TopDev đã cung cấp cho bạn cái nhìn tổng quan về Node.js là gì, đặc điểm và cách sử dụng Node.js
BEM là viết tắt của Block-Element-Modifier, là một tiêu chuẩn quy ước đặt tên cho các tên lớp CSS. BEM giúp cho việc code Frontend dễ đọc và dễ hiểu hơn, dễ làm việc và dễ mở rộng cũng như bảo trì khi làm việc với CSS.
Việc đặt tên theo chuẩn giúp các lập trình viên frontend hiểu được đoạn code đó có ý nghĩa gì, nó thực hiện nhiệm vụ gì. Từ đó những lập trình viên khác khi đọc vào code của bạn họ cũng hiểu được bạn đang làm gì, từ đó dễ dàng phân tích, thay đổi và quản lý hơn sau này.
Tại sao nên sử dụng BEM?
Trong những dự án nhỏ có thể BEM chưa cần sử dụng nhưng trong các dự án lớn và làm việc với nhóm thì BEM rất quan trọng.
BEM giúp cho cả team làm việc với nhau dễ dàng: Khi làm Teamwork với nhau, mỗi người sẽ có một cách đặt tên class riêng và sẽ bị conflict với nhau. Sử dụng BEM sẽ loại bỏ vấn đề này, vì có cấu trúc rõ ràng và dễ tuân thủ khi sử dụng.
Modules: Các class của mỗi block sẽ không bị ảnh hưởng bởi các yếu tố khác, nên bạn sẽ không lo CSS của class này sẽ gây ảnh hưởng lên class khác.
Tái sử dụng lại: Bạn có thể soạn các block độc lập với nhau và sử dụng lại chúng một cách thuận tiện, giảm số lượng code CSS.
Cấu trúc: BEM cung cấp cho CSS của bạn một cấu trúc vững chắc, đơn giản và dễ hiểu.
1. Block: Là một thành phần của trang web hay ứng dụng đó, các thành phần của DOM cũng có thể là các block. Block ở đây thường là các thành phần header, body, content, footer. Ví dụ section td bên dưới tập hợp các block sau:
.td__container làm nhiệm vụ cân max width và padding left right
.td__inner làm nhiệm vụ cân padding top bottom và điểm bám cho các element absolute. VD: chỉnh một button…
.td__header chứa Sub-title.
.td__content chứa Headline và Description.
.td__footer chứa button CTA.
Các prefix của các class đều là td giúp chúng ta có thể nhận diện section khi muốn update mục tương ứng trong css.
2. Elements: Là một thành phần của một block và sẽ không tồn tại độc lập mà không có block vì được đặt bên trong nó, và chúng phụ thuộc vào parent block của nó. Trong BEM, các phần tử được biểu thị bằng dấu gạch dưới kép __.
.td__headline là Text cỡ lớn. Style thường là H1 hoặc H2.
.td__intro, .td__description làm mô tả content.
.td__image chứa ảnh.
.td__button với style riêng cho button trong section này.
3. Modifers: Được dùng để thao tác thay đổi cách hiển thị trên block hoặc phần tử. Ví dụ mình muốn tạo thêm một block .block__elem khác nữa và muốn làm nổi bật nó thì sẽ thêm một class .block__elem--hightlight để tạo sự khác biệt đó. Ví dụ:
Ở đây btn là block .btn—red là modifier. Style của chúng ta như sau:
Khi bắt đầu 1 porject chúng ta cần xem rõ guide và style những component dùng chung để có thể tái sử dụng được và tồn tại độc lập với các component khác. Chúng ta hãy xem các component của bootstrap một ví dụ tốt về component.
Tên selector của component thì đặt là namespace
Không được đặt một class con như sau: .block__parent__eye mà thay vào đó để miêu tả mỗi quan hệ giữa các khối và phần tử với nhau như sau .block__parent--eye.
Duy trì tính modules
Tránh sử dụng để viết CSS cho id, cụ thể là những trường hợp ưu tiên trong CSS.
Ở bài trước, đã có giải thích về việc Laravel đã xử lý một request như thế nào?. Giờ chúng ta cùng xem Service Provider hoạt động như thế nào trong ứng dụng web nhé.
Service Provider là gì?
Service Provider là thành phần trung tâm của việc khởi tạo tất cả các ứng dụng Laravel bao gồm các thành phần core. Việc đăng kí các liên kết tới service container, event listeners, middleware, và thậm chí các route. Service provider chính là nơi để cấu hình ứng dụng của bạn. Đây cũng chính là nơi khai báo các service provider sau này khi muốn viết một service provider. Hay sử dụng các package từ packagist bạn cũng thường phải khai báo thêm service provider mới tại đây.
Service Provider trong Laravel
Cùng quay lại một chút ở bài trước trong phần handle request. Đoạn này nằm xen kẽ giữa lúc Laravel nhận request và dispatch request lên router. Đây là nơi quá trình bootstrapping bắt đầu diễn ra.
$this->bootstrap();
public function bootstrap()
{
if (! $this->app->hasBeenBootstrapped()) {
$this->app->bootstrapWith($this->bootstrappers());
}
}
Bạn có thể xem nó tại Illuminate\Foundation\Application.php Hàm này sẽ nạp các bootstrappers. Các bootstrappers ở đây được lấy từ trong hàm $this->bootstrappers(). Đó là những class sau:
protected $bootstrappers = [
\Illuminate\Foundation\Bootstrap\LoadEnvironmentVariables::class, // nạp các biến môi trường
\Illuminate\Foundation\Bootstrap\LoadConfiguration::class, // nạp các configuration file
\Illuminate\Foundation\Bootstrap\HandleExceptions::class, // nạp các file cho việc xử lý exceptions
\Illuminate\Foundation\Bootstrap\RegisterFacades::class, // đăng ký facade
\Illuminate\Foundation\Bootstrap\RegisterProviders::class, // đăng ký các service provider
\Illuminate\Foundation\Bootstrap\BootProviders::class, // boot
];
Mở file Illuminate\Foundation\Application.php và tìm đến hàm bootstrapWith ta sẽ thấy hàm này sẽ tạo ra các bootstrappers mà đã liệt kê bên trên, sau đó nạp các bootstrappers này vào trong application của bạn.
$this->make($bootstrapper)->bootstrap($this);
Giờ chúng ta sẽ tìm hiểu xem Laravel Service provider hoạt động như thế nào nhé. Chúng ta biết biết chắc chắn là trong mỗi bootstrapper này đều có một hàm bootstrap.
Ở đây chúng ta sẽ đi vào class \Illuminate\Foundation\Bootstrap\RegisterProviders::classđể xem Service Provider đã làm những gì cho application của chúng ta:
public function bootstrap(Application $app)
{
$app->registerConfiguredProviders();
}
Ở đoạn xử lý đầu tiên, $providers của chúng ta sẽ trả về một kết quả đó là danh sách các provider nằm trong key 'providers' và bắt đầu bằng Illuminate\\ tại config/app.php.
Ở đoạn xử lý thứ 2, Laravel sẽ gộp các providers có được tại hàm
$this->make(PackageManifest::class)->providers()
vào các providers đã lấy được ở trên. Chúng ta sẽ xem các providers trong cái hàm ở trên là những providers nào nhé. Illuminate\Foundation\PackageManifest.php:
public function providers()
{
return collect($this->getManifest())->flatMap(function ($configuration) {
return (array) ($configuration['providers'] ?? []);
})->filter()->all();
}
Xem hàm getManifest
protected function getManifest()
{
if (! is_null($this->manifest)) {
return $this->manifest;
}
if (! file_exists($this->manifestPath)) {
$this->build();
}
$this->files->get($this->manifestPath, true);
return $this->manifest = file_exists($this->manifestPath) ?
$this->files->getRequire($this->manifestPath) : [];
}
Nên nhớ ở trên chúng ta make một class PackageManifest và không truyền cho nó cái gì cả. Vậy thì constructor của nó cũn không có gì. Vậy là trong hàm getManifest(), property $this->manifest ở đây đang không có giá trị.
Khởi tạo một instance từ Laravel Application
Laravel khởi tạo một instance của PackageManifest.
$this->instance(PackageManifest::class, new PackageManifest(
new Filesystem, $this->basePath(), $this->getCachedPackagesPath()
));
Trước hết hãy để ý một điều, Laravel sử dụng hàm này trước khi quá trình bootstrapping xuất hiện. Vậy lúc này trong class PackageManifest có gì ??
Chúng ta đang cần quan tâm đến hàm providers vậy nên ta cần biết tham số thứ 3 trong constructor, đó là $manifestPath là gì.
Tương ứng như chúng ta thấy, đó là:
Giờ chúng ta hiểu, giá trị $this->manifestPath chính là chuỗi bootstrap/cache/packages.php, hãy cùng tiếp tục xem Service Provider đã làm gì tiếp theo.
Mở file bootstrap/cache/packages.php , chúng ta thấy 1 array chứa các cặp array khác có key là 'providers' và 'aliases'. Mà hàm providers của chúng ta lấy các key là 'providers'
Đến đây có thể hiểu rằng Laravel sẽ lấy tất cả các providers trong application của chúng ta bằng cách lấy các providers có tiền tố Illuminate\\ tại config/app.php và danh sách các providers tại caches/packages.php. Sau khi tập hợp tất cả các providers chúng ta sẽ quay lại hàm registerConfiguredProviders():
(new ProviderRepository($this, new Filesystem, $this->getCachedServicesPath()))
->load($providers->collapse()->toArray());
Trong hàm này, tất cả các đăng ký các event khi load các provider, sau đó từng provider này sẽ được đăng ký bằng cách gọi đến hàm register trong class Application:
foreach ($manifest['when'] as $provider => $events) {
$this->registerLoadEvents($provider, $events);
}
// We will go ahead and register all of the eagerly loaded providers with the
// application so their services can be registered with the application as
// a provided service. Then we will set the deferred service list on it.
foreach ($manifest['eager'] as $provider) {
$this->app->register($provider);
}
Trong hàm register tại class Application, mỗi service provider sẽ được gọi đến method register của chính provider đó.
if (method_exists($provider, 'register')) {
$provider->register();
}
Và nếu các bạn có để ý, trong các provider tại method register, chúng ta sẽ thường sử dụng việc binding tại hàm này, Tuy nhiên có một cách ngắn hơn đó là nếu provider của bạn đang có property là $bindings hoặc $singletons thì Laravel sẽ tự động binding theo cặp key, value này.
if (property_exists($provider, 'bindings')) {
foreach ($provider->bindings as $key => $value) {
$this->bind($key, $value);
}
}
if (property_exists($provider, 'singletons')) {
foreach ($provider->singletons as $key => $value) {
$this->singleton($key, $value);
}
}
// Ví dụ
public $bindings = [
A::class => B::class,
];
//=> $this->bind(A::class, B::class);
/**
* All of the container singletons that should be registered.
*
* @var array
*/
public $singletons = [
A::class => B::class,
];
//=> $this->singleton(A::class, B::class);
Đến đây, nếu application của bạn chưa nạp các provider thì nó sẽ nạp tất cả các provider đó. Nếu không, nó sẽ chỉ nạp các provider mới. Thay vì phải quay lại làm một công việc từ đầu, thì nó sẽ không làm lại nữa mà chỉ làm các công việc mới.
if ($this->booted) {
$this->bootProvider($provider);
}
protected function bootProvider(ServiceProvider $provider)
{
if (method_exists($provider, 'boot')) {
return $this->call([$provider, 'boot']);
}
}
Giải thích ngắn gọn dễ hiểu để bạn mường tượng hơn. Ví dụ chúng ta có sẵn một bộ máy tính để bàn bao gồm CPU, chuột, bàn phím…Bạn muốn gắn thêm màn hình hay thay một bàn phím cơ khác thì chỉ cần plug and play thôi. Không phải build lại cái máy tính từ đầu.
Với Laravel cũng vậy, sau khi kết thúc quá trình bootstrapping lần đầu tiên, các package/library hiện có đã có thể sử dụng.
Giả sử bạn muốn install thêm các package/library khác thì Laravel chỉ nạp lại những package mới này và đăng ký các provider tương ứng cho chúng vào application của bạn. Vậy là chúng ta sẽ hiểu việc đăng ký providers như sau:
$providers = Collection::make($this->config['app.providers'])
->partition(function ($provider) {
return Str::startsWith($provider, 'Illuminate\\');
});
// lấy tất cả provider có tiền tố là Illuminate\\ từ config/app.php
$providers->splice(1, 0, [$this->make(PackageManifest::class)->providers()]);
// lấy tất cả các providers từ bootstrap/cache/packages.php rồi kết hợp với các providers ở trên.
// Lúc này trong application chúng ta đã có đc đầy đủ các providers rồi
(new ProviderRepository($this, new Filesystem, $this->getCachedServicesPath()))
->load($providers->collapse()->toArray());
// Các providers này sẽ được gọi tự động đăng kí (register), nạp vào application (boot)
Vậy nên chúng ta thường thấy các provider sẽ có các phương thức như boot hay register mà không phải các phương thức khác, tất cả là do Laravel đã thiết kế nên như vậy. Đã bao giờ các bạn sử dụng command để thêm các package/library ngoài vào, sau đó thêm các provider của nó vào trong config/app.php chưa?
Thường thì chúng ta chỉ cần import nó vào và sử dụng mà không cần biết rằng tại sao nó lại vận hành được. Thật ra thì vấn đề này Laravel đã giúp chúng ta làm tất cả rồi.
Tổng kết
Service Provider là một khái niệm khá trừu tượng, và là thành phần quan trọng nhất trong quá trình handle một request trong Laravel. Hiểu một cách tổng quan là trong quá trình bootstrapping application thì Service Provider chính là phần quan trọng nhất.
Trong thế giới IT, sự khác biệt giữa các vị trí rất rõ ràng. Là một coder hay Product Manager (PM) bạn đều cần có những kỹ năng và kiến thức đặc biệt. Chỉ có những coder, với kinh nghiệm cùng kỹ năng tốt mới có thể trở thành Product Manager.
Sau đây là những chia sẻ trên Quora từ anh Kevin – founder của AltSchool và hiện đang làm việc tại quỹ đầu tư mạo hiểm FundersClub.
Các yếu tố một Product Manager cần có.
1. Hiểu sản phẩm và thị trường
Hiểu rõ sản phẩm và thị trường là một yếu tố quan trọng của Product Manager. Khi đã trở thành một Product Manager, bạn nhất thiết phải hiểu sản phẩm đó một cách rất chi tiết. Tuy vậy, chỉ đơn thuần hiểu sản phẩm là không đủ. Là một Product Manager, bạn nhất thiết phải hiểu thị trường tiềm năng, hiểu rõ tâm lý khách hàng hiện tại, và cả nhóm khách hàng bạn muốn hướng đến.
Không chỉ thế Product Manager còn cần phải biết mục tiêu mà sản phẩm hướng đến, thậm chí cả sản phẩm của công ty đối thủ. Ví dụ như, nếu bạn đang là Product Manager phụ trách tính năng hình của Facebook, bạn nên nghiên cứu sản phẩm của Picasa, Instagram vì nó ảnh hưởng trực tiếp đến “miếng cơm manh áo” của bạn.
2. Đứng trên góc nhìn của người dùng cuối (End-user)
Là một Product Manager, bạn cũng kiêm luôn vai trò “phát ngôn viên” của người dùng cuối (end-user). Trong bất kì lĩnh vực nào Product Manager đều luôn phải chú trọng đến việc quan tâm và thấu hiểu những vấn đề của khách hàng. Một sản phẩm tốt luôn giải quyết được vấn đề của khách hàng.
Chúng ta có thể lấy ví dụ đơn giản sau, giả sử như có một người là khách hàng “thường trực” trên trang Amazon, đã thực hiện rất nhiều đơn hàng và cảm thấy ngán ngẩm với việc phải nhập đi nhập lại thông tin của mình mỗi lần đặt hàng.
Nếu là một Product Manager biết lắng nghe và nói lên “tiếng nói” của khách hàng, người Product Manager này sẽ thúc giục đội ngũ của mình thêm chức năng tự động lưu địa chỉ, thông tin thanh toán. Nhờ thế, người khách hàng chỉ cần “one click” và anh ta lại có thể tiếp tục đặt hàng, giúp tăng trải nghiệm người dùng (UX) theo chiều hướng tích cực.
3. Tập trung vào trải nghiệm người dùng (UX) và giao diện người dùng (UI)
Lại là chuyện UX và UI, tưởng là chuyện nhỏ nhưng lại rất quan trọng, chỉ đơn thuần giải quyết vấn đề của khách hàng vẫn còn chưa đủ. Sản phẩm phải có một UI cực kì đơn giản và dễ dùng. UX cũng phải được đảm bảo.
Một ví dụ kinh điển nhất đó chính là Facebook. Facebook không phải là người đi đầu trong “sân chơi” mạng xã hội. Có rất nhiều sản phẩm lúc bây giờ như Mýpace, Hi5 tuy nhiên Facebook có những tính năng tuyệt hơn, tốc độ tải tốt hơn và UX mượt mà cùng UI tối giản. Cuối cùng phần thắng thuộc về ai, bạn hẳn đã rõ.
4. Luôn đảm bảo sản phẩm của bạn được xây dựng dựa trên “sự thật”
Khi trở thành một Product Manager, nếu bạn muốn thêm một tính năng vào sản phẩm, bạn cần phải chắc chắn về độ cần thiết của nó thông qua dữ liệu được trả về từ người dùng và nhiều yếu tố khác.
Giả như có một tính năng, trên lý thuyết rất hữu ích, nhưng khách hàng vẫn không sử dụng. Do đó, bạn muốn tìm ra cách làm cho tính năng ấy “nổi bật” và được khách hàng chú ý hơn. Lúc này, bạn cần thay đổi nhiều kiểu thiết kế (cả UI và UX) khác nhau cho tính năng đó và thu thập dữ liệu nhằm phân tích để có thể kết luận đâu là thiết kế tốt nhất giúp sản phẩm dễ dàng tiếp cận người dùng nhất. Đừng chỉ tạo ra một phiên bản chỉ dựa trên đoán mò.
5. Chủ động hợp tác cùng đội ngũ của bạn
Ngoài hợp tác với khách hàng, Product Manager còn phải chủ động hỗ trợ đội ngũ của mình bao gồm các đơn vị như Sales, Marketing và IT. Ngoài ra, bạn cũng phải hợp tác với các Project Managers, Business Analysts và Developers.
Tất cả điều này cực kì quan trọng bởi họ là người dựng nên sản phẩm của bạn, họ phải hiểu rõ mục tiêu và tầm nhìn của sản phẩm. Một Product Manager tốt luôn có một tầm nhìn tốt cho sản phẩm và biết mình sắp phải lèo lái sản phẩm theo hướng nào. Nếu Product Manager không thực hiện tốt tất cả điều này, sản phẩm sẽ trở nên “lạ hoắc” và khác hoàn toàn so với dự định ban đầu.
Một Product Manager tốt luôn biết sản phẩm cần có những gì trong suốt SDLC (Software Development Lifecycle – Quy trình phát triển phần mềm). Product Manager còn cần phải tham gia tất cả cuộc họp hằng ngày, cùng phân tích vấn đề với toàn đội ngũ để đưa sản phẩm tới đợt giới thiệu sản phẩm thành công (Launch).
Nhạy cảm với thay đổi và nắm kịp xu thế của thị trường là một tốt chất quan trọng mọi Product Manager cần có. Giả như bạn là Product Manager của Yammer, bạn phải nắm rõ kế hoạch bắt đầu phát triển vào thị trường mạng xã hội cho doanh nghiệp của Facebook, liệu có nguy cơ gì từ động thái này.
Luôn cập nhật tin tức mới nhất để sản phẩm của bạn không bị bỏ lại trong cuộc đua công nghệ là điều rất quan trọng.
7. Đừng ngại thay đổi và cải tiến
10 năm trước không ai ngờ Nokia, Kodak và MySpace, những ông lớn công nghệ như vậy lại có thể trở thành “kỉ niệm đáng buồn”.
Nếu bạn ngại ngần thay đổi sản phẩm và không cải tiến sản phẩm, bạn đang làm cho chính mình lỗi thời khi đối thủ của bạn làm điều đó. Chỉ cần nghĩ về sự phát triển nhanh đến “choáng ngợp” của điện thoại, chụp ảnh và mạng xã hội trong 5 năm qua, bạn sẽ hiểu rõ điều đó. Đừng bao giờ “ngủ quên trên chiến thắng”.
8. Kinh nghiệm
Qua chia sẻ của anh Kevin Lee, chúng ta đã biết được một số tố chất cần thiết để trở thành một Product Manager. Tuy nhiên, thực tế lại “lắm chông gai” hơn nhiều. Công việc thực tế cần kinh nghiệm, cũng như am hiểu về thị trường. Bạn có thể tìm những điều đó tại những workshop chia sẻ kinh nghiệm để có thể học trực tiếp từ những người đi trước.
Lâu nay khi lập trình chúng ta chủ yếu sử dụng kiểu dữ liệu List để thao tác với các collection, mặc dù đây không phải là kiểu collection duy nhất trong .NET nhưng các lập trình viên đã quá quen thuộc với việc sử dụng kiểu List nên thói quen này không phải dễ thay đổi.
Trong bài viết này chúng ta sẽ cùng so sánh tốc độ của kiểu List và HashSet (một kiểu collection xuất hiện bắt đầu từ .NET 3.5) để biết được khi nào thì nên sử dụng List và khi nào thì nên dùng kiểu HashSet.
Kiểu List<T>
Kiểu List<T> chứa một danh sách item, truy cập qua chỉ số. Không giống như kiểu mảng là một kiểu cố định kích thước, list tự động tăng kích thước khi cần. Đây chính là lý do tại sao List đôi khi còn được gọi là kiểu mảng động.
Cấu trúc bên trong của List thực chất là một mảng, nếu mảng này hết chỗ nó sẽ tạo ra một mảng mới lớn hơn và copy toàn bộ item từ mảng cũ sang mảng mới. Ngày nay thì chúng ta thấy hầu hết lập trình viên đều dùng kiểu List thay vì kiểu mảng. Tuy nhiên trong một số trường hợp nếu item là cố định thì bạn nên dùng kiểu mảng để có performance tốt hơn.
Một số phép toán trên kiểu List
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
privatestaticvoidListOperation()
{
varintList=newList<int>(100);
intList.Add(5);
intList.RemoveAt(0);
//Add item at index
intList.Insert(0,10);
intList.Insert(1,7);
varfirst=intList[0];
// Index of an item
varindex=intList.IndexOf(4);
// Check List contains item
boolcontain=intList.Contains(4);
// Iterate over all objects
foreach(varitem inintList)
Console.WriteLine(item);
}
Thêm/Xóa phần tử ở đầu hoặc giữa List
Nếu bạn cần thêm/xóa một phần tử ở đầu hoặc giữa List thì nó sẽ cần dịch chuyển một hoặc nhiều item. Trường hợp xấu nhất, nếu bạn thêm/xóa một phần tử ở đầu List nó sẽ phải dịch tất cả item còn lại trong List. Nếu List càng lớn thì sẽ càng mất thời gian và resource để thực hiện.
Thêm/Xóa phần tử ở cuối List
Thêm/Xóa một phần tử ở cuối List ngược lại rất nhanh và không phụ thuộc vào kích thước của List vì không item nào cần phải dịch chuyển.
Tìm kiếm một phần tử
Khi tìm kiếm một phần tử bằng một số hàm như IndexOf, Contains, Find thì kiểu List sẽ thực hiện duyệt qua tất cả các item để tìm ra phần tử đó. Trong trường hợp xấu nhất, nếu phần tử nằm ở cuối List thì tất cả các item cần được duyệt qua.
Truy cập một phần tử bởi chỉ số
Là phép toán thực hiện rất nhanh vì bản chất bên trong List là một mảng. Tốc độ truy cập không bị ảnh hưởng bởi độ lớn của List.
HashSet là kiểu xuất hiện từ .NET 3.5, nó chứa các item duy nhất, nghĩa là nó không thể chứa các item trùng lặp và thứ tự của item cũng không quan trọng. VD: {a,b,c} tương đương {c,b,a}
Sử dụng HashSet khi bạn cần tìm kiếm nhanh trên một tập các item không lặp. VD trong bài toán thực tế mình đang phải làm là kiểm tra một danh sách Order có nằm trong một danh sách Order khác không?
Kiểu HashSet dựa trên hàm hash để tính toán ra chỉ số của item vì vậy phép tìm kiếm có tốc độ rất nhanh. Dưới đây là một số phép toán trên kiểu HashSet
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
privatestaticvoidHashSetOperation()
{
varintHashSet=newHashSet<int>(){1,2,3,4,5};
intHashSet.Add(10);
intHashSet.Remove(5);
//Check Set contains item
boolcontain=intHashSet.Contains(1);
// Iterate over all objects
foreach(varitem inintHashSet)
Console.WriteLine(item);
//Delete all items
intHashSet.Clear();
}
So sánh tốc độ List<T> và HashSet<T>
Mặc dù trong các tài liệu đều chỉ ra kiểu HashSet nhanh hơn List nhưng thực tế có phải luôn luôn như vậy? Chúng ta sẽ cùng kiểm nghiệm qua một ví dụ benchmark đơn giản: Kiểm tra một danh sách có nằm trong một danh sách khác hay không:
Từ kết quả trên có thể thấy rằng không phải lúc nào performance của HashSet cũng nhanh hơn List. Với số lượng item nhỏ (<50 item) thì tốc độ của List còn nhanh hơn so với HashSet nhưng khi số lượng item lớn thì lúc đó HashSet mới phát huy tác dụng, tốc độ của HashSet rất nhanh và không phụ thuộc vào số lượng item.
Kết luận
Kiểu List tương đối nhanh khi bạn truy cập item bằng index nhưng khi tìm kiếm một item trong List lớn (50 item trở lên) thì nó sẽ chậm dần. Ngược lại kiểu HashSet lại rất nhanh khi tìm kiếm trên một tập item lớn. Vì vậy mà tùy từng trường hợp cụ thể bạn cần lựa chọn kiểu collection cho phù hợp với bài toán của mình.
Chào các bạn, số là hôm nay bữa giờ trong cái group Launch trên facebook có thấy 1 bài có 1 member tặng phần mềm email marketing (miễn phí) cho các bạn bình luận. Có đến gần 500 comment chứa nội dung email nên thiết nghĩ đây là 1 kho báu cho những ai đang làm các tool email marketing, còn gì tuyệt vời hơn khi có gần 500 email khách hàng cực kỳ tiềm năng và sẵn sàng sử dụng. Mình nghĩ cũng có nhiều người như mình nhưng phải ngồi copy từng email ra thì thiệt là khổ, nay chia sẻ mọi người cách nhanh nhất (3 phút) để “copy” toàn bộ các email này.
Bước 1: Nhấn xem tất cả bình luận.
Để đảm bảo nội dung không bị nhiễu, bước đầu tiên là bạn cần xem bài post ở chế độ xem 1 bài mà thôi, nhấn vào cái thời gian bên dưới tên người gửi sẽ tới trang chi tiết của bài. Tiếp theo, đây là bước trâu bò và không cần kỹ thuật cao siêu, cứ nhấn nút xem bình luận trước để hiện hết tất cả bình luận. Sau khi click đã đời thì trên web đã hiển tất cả bình luận.
Bước 2: Copy nội dung “thô”.
Trong trình duyệt, chọn tất cả nội dung (Ctrl+A) hoặc trên menu “Edit \ Select All”, sau đó copy vào paste vào một trình soạn thảo text nào đó mạnh mạnh xíu. Tại sao mạnh, bởi vì cần dùng trình duyệt nào có hỗ trợ chế độ tìm theo Regular Expression, đây là chế độ giúp mình tìm kiếm nhanh chóng các địa chỉ email và copy ra. Ở đây mình dùng Sublime Text (trên Mac).
Bước 3: Tách email
Đến đây, bạn đã có được nội dung thô và đang nằm trong text editor của bạn, chỉ cần bật chế độ tìm kiếm theo Regular Expression (có thể search google cách bật chế độ tìm này trong text editor vì mặc định nó tắt). Nhập nội dung tìm kiếm sau:
\w+\@\w+\.\w+
” và nhấn tìm tất cả. Khi nhấn tìm tất cả thì tất cả email sẽ được highlight. Sublime Text có hỗ trợ multiselect nên sau khi highlight toàn bộ email, chỉ cần copy (Ctrl+c) và mở 1 file khác paste vào. Voila! Đã có danh sách email khách hàng tiềm năng.
Như vậy, với 1 vài thao tác là bạn đã có 1 tập khách hàng tiềm năng. Dạng bài viết kêu gọi bình luận email, số điện thoại (sẽ dùng 1 chuỗi regular expression khác) rất nhiều, nếu biết tận dụng thì đây là một nguồn lead rất tốt. Là một người làm biếng, mình thích những kỹ thuật trích xuất hàng loạt và có thể lập lại được, như vậy sẽ tiết kiệm được rất nhiều thời gian. Nếu có thời gian thì có thể sẽ viết 1 chrome extension để tự động hóa hơn xíu, chỉ cần 5s chẳng hạn.
Chúc các bạn một ngày “copy” hiệu quả và nhớ có spam thì đừng đổ thừa Tuấn.
Tính năng mua sắm mới của Instagram ‘Checkout’ cho phép người dùng mua hàng trong ứng dụng.
Instagram đã tiết lộ “Checkout”, một tính năng mới cho phép người dùng thực hiện mua hàng bên trong ứng dụng mà không phải chịu sự phiền hà nào.
Tính năng “Checkout” mang chuẩn thương mại điện tử: 20 brands đã tham gia vào buổi giới thiệu bao gồm Nike, Dior, Warby Parker, Zara,… tính năng cho phép người dùng không chỉ xem các quảng cáo mà còn có thể chi tiền để mua ngày trong chính quảng cáo. Thông tin thanh toán được lưu trữ trong Instagram và người dùng cung cấp địa chỉ email để nhà bán lẻ có thể hoàn tất giao dịch. Nhà bán lẻ sẽ cắt phần trăm hoa hồng cho Instagram theo doanh thu bán hàng,theo báo cáo từ TechCrunch.
Mặc dù dự án có thể trông giống như một bản cập nhật thông thường, chỉ mang lại sự tiện lợi hơn cho người dùng và sự nổi bật cho các brands, nhưng đó là đỉnh cao của sự cố gắng từ Facebook để không chỉ thu hút mà còn chuyển sự chú ý của bạn thành tiền. Với sự phát triển quảng cáo của Facebookđang chững lại sau vụ bê bối về quyền riêng tư làm mất danh tiếng với công chúng, công ty sẽ tìm cách khai thác sự chú ý của 130 triệu người dùng đã sử dụng các sản phẩm trên Instagram mỗi tháng.
Trong nhiều năm qua, giám đốc Facebook Mark Zuckerberg đãkhông giấu giếm tham vọng của mình bằng việc di chuyển mọi thứ trên internet vào bên trong khu vườn có bức tường Facebook bao quanh, bằng quyền lực nếu cần thiết. Khi có thể, Facebook sẽ mua các đối thủ của mình (như Whatsapp và Instagram). Hầu hết các sản phẩm được Facebook tiết lộ khá rõ ràng về các dịch vụ tồn tại bên ngoài: Facebook Marketplace cho Craigslist, Facebook Stories cho Snapchat, Facebook Instant Article cho Google News, v.v.
Giờ đây, với Checkout, Facebook có thể sử dụng Instagram để làm mũi tên cảnh cáo với Amazon hoặc ít nhất là cố gắng tự mình lấy một miếng bánh trong thị trường.
TopDev via Popularmechanics
Đừng bỏ lỡ những xu hướng shopping cũng như thanh toán mới nhất qua sự kiện Vietnam Mobile Day 2019 do TopDev tổ chức.
JVM (Java Virtual Machine) là 1 máy ảo java – nó được dùng để thực thi các chương trình Java hay hiểu nôm na là trình thông dịch của Java. Nó cung cấp môi trường để code java có thể được thực thi. Chương trình Java khi biên dịch sẽ tạo ra các mã máy gọi là bytecodes. Như bạn thấy mỗi hệ điều hành chạy chương trình của nó ứng với một mã máy khác nhau đó là mã bytecodes, ví dụ Windows được biên dịch dưới dạng exe còn Linux là .ELF…
Định nghĩa JVM
Tóm gọn lại là mỗi nền tảng/hệ điều hành khác nhau (Windows, Android, Linux…) lại có một loại JVM khác nhau được cài đặt. Nói Java đa nền tảng, thực chất thì nó được hỗ trợ JVM trên nhiều nền tảng. Chương trình Java chạy được trên Window/Linux/IOS vì nó có JVM chạy được trên các nền tảng đó, vì vậy mới hiểu ý nghĩa là lập trình Java một nơi nhưng chạy được nhiều chỗ là do JVM này thực hiện.
Các bạn có thể tham khảo cơ chế thực hiện 1 chương trình Java trong sơ đồ dưới đây :
Máy ảo java được sinh ra với 3 mục đích chính
Dịch mã java ra mã máy chạy được trên các hệ điều hành khác nhau
Data Area : vùng nhớ hệ thống cấp phát cho Java Virtual Machine
Execution Engine: chuyển các lệnh của JVM trong file *.class thành các lệnh của máy, hệ điều hành tương ứng và thực thi chúng.
Cơ chế thực hiện
Sau khi Classloader tìm và load các file .class, các file này sẽ được máy ảo JVM cung cấp bộ nhớ tương ứng với chúng.
Class (Method) area: là vùng nhớ cấp phát cho class(Method) trong đó lại phân chia thành heap, stack, PC register, native method stack
Heap: Đây là khu vực dữ liệu thời gian chạy trong đó các đối tượng được phân bổ.
Stack : Các phương thức và tham chiếu tới đối tượng địa phương được lưu trữ trong Stack. Mỗi Thread quản lý một stack. Khi phương thức được gọi, nó được đưa vào đỉnh của Stack. Stack lưu trữ trạng thái của phương thức bao gồm: dòng code thực thi, tham chiếu tới đối tượng địa phương. Khi phương thức chạy xong, vùng nhớ (dòng code thực thi, tham chiếu tới đối tượng địa phương) được đẩy ra khỏi stack và tự động giải phóng.
PC register (Program Counter Register) : Nó chứa địa chỉ của các máy ảo Java hướng dẫn hiện đang được thực hiện.
Native Method Stack: Nơi chứa tất cả các method native trong chương trình
Execution Engine: Nó bao gồm: Một bộ xử lý ảo, một phiên dịch để đọc dòng bytecode sau đó thực hiện các hướng dẫn và cuối cùng là trình biên dịch Just-In-Time (JIT). JIT biên dịch các phần của mã byte có chức năng tương tự như cùng một lúc, và do đó làm giảm số lượng thời gian cần thiết cho compilation.*Thuật ngữ: trình biên dịch là đề cập đến như một dịch giả từ những hướng dẫn của một máy ảo Java (JVM) cho các tập lệnh của CPU cụ thể.
Xu hướng font chữ đẹp cho năm 2022 là gì? Sử dụng những font chữ đẹp mắt luôn là một trong những cách truyền tải thông điệp với khách hàng hữu dụng nhất trong thiết kế. Đó chính là lý do vì sao việc cập nhật những xu thế về typography là cực kỳ quan trọng với mỗi designer.
Những font chữ sáng tạo không chỉ đơn giản diễn đạt lại thông tin thông qua những ký tự chữ cái, nó còn đem lại người xem những ấn tượng về thị giác, và khơi dậy nhiều cảm xúc. Font chữ có thể diễn tả sự vui hay sự sợ hãi, sự ồn ào hay tĩnh lặng đến lạ kỳ. Những hỷ nộ ái ố chưa bao giờ rõ đến vậy qua những con chữ.
1. Font chữ Bold lớn và đậm
Trong năm 2022, xu hướng sử dụng những font chữ cực lớn, đậm và tạo cảm giác “ồn ào” sẽ tiếp tục trở nên phổ biến trong giới thiết kế. Những font chữ này chủ yếu được sử dụng như một thành tố chính, nổi bật trong thiết kế. Nếu bạn muốn người xem nhìn vào thiết kế, và hét thật to câu khẩu hiệu của bạn? Các font đậm này sẽ là lựa chọn số một dành cho bạn.
Font đậm khiến nội dung đó đập ngay vào mắt người nhìn, ở bất kỳ đâu bạn đặt vào. Poster hay từ rơi chắc chắn sẽ nổi bật từ xa, nhờ những font chữ này. Muốn Website của bạn trở nên “cá tính” hơn, thân thiện hơn? Hãy sử dụng những phông chữ lớn này.
2. Font chữ Sans Serif – không chân tối giản
Chia tay với font chữ đậm lớn ở phần 1, chúng ta cùng chào đón font không chân tối giản, một “gã” hoàn toàn đối lập với anh bạn ồn ào nhà bên. Với xu hướng tối giản hóa trong thiết kế, font chữ Sans Serif, hay còn biết tới là font không chân chắc chắn là người bạn đồng hành không thể thiếu cho những nhà thiết kế theo trường phái tôn thờ sự đơn giản.
Nhờ vào sự tối giản, những phông chữ này có thể dễ dàng thích ứng với nhiều trường hợp khác nhau. Nó cũng không yêu cầu quá nhiều yếu tố trực quan. Khi được sử dụng một cách hợp lý, các font chữ này chắc chắn sẽ đem lại hiệu quả vô cùng lớn.
Những phông không chân tối giản khơi gợi cho người đọc cảm xúc nhẹ nhàng, thư thả, trầm lắng mà cũng vô cùng điềm tĩnh. Thay vì phải hét lên với câu khẩu hiệu lớn, bạn hãy cho người xem “một chút bình yên, một chút sâu lắng”. Hãy để không gian lắng đọng cùng những font chữ này.
Càng hướng về tương lai, con người ta lại có xu hướng nuối tiếc, hoài niệm những ký ức đã qua. Trend vintage đang thống trị trong thế giới thiết kế, từ thời trang, nội thất đến thiết kế đồ họa. Sẽ chẳng ngạc nhiên gì khi trong năm 2022, chúng ta đón nhận rất nhiều những font chữ được thiết kế ra để bắt kịp trào lưu Vintage này.
Bạn có thể sử dụng những font chữ vintage này để tạo logo hay cho các sản phẩm bao bì, những thứ đòi hỏi sự trang nhã và lịch sự, nghiêm túc. Bạn còn có thể sử dụng các font chữ đậm, mang hơi hướng phức tạp mà hoài cổ. Với những ai muốn níu giữ một chút kỷ niệm trong một thế giới hiện đại bộn bề, phong cách vintage chắc chắn sinh ra là để dành cho bạn.
4. Font chữ viết tay
Các font chữ mang hơi hướng viết tay chưa bao giờ tỏ ra hết thời. Nó là sự tổng hòa giữa tính lưu loát của nét chữ viết tay, với sự trang nhã, thanh lịch của những ký tự thư pháp.
Trong năm 2022, các phông viết tay (dạng script) đã phát triển và biến hóa rất nhiều với đa dạng những hình thù, phong cách khác nhau. Chúng có thể tinh nghịch, cổ điển, hay nghiêm túc, đơn giản hoặc phức tạp. Với font chữ viết tay, bất kỳ kiểu dáng nào cũng có. Bạn sẽ phải choáng ngợp trước những gì phông chữ này mang lại đến sản phẩm của mình.
5. Font chữ outline
Một khi bạn đang bí ý tưởng về font chữ tiêu đề, hay muốn tìm kiếm một phông chữ thể hiện sự trưởng thành và sang trọng, các outline font (phông chữ viền, có hình bao) là lựa chọn dành cho bạn.
Năm 2022 tới, font chữ này “xâm lấn” khắp mọi nơi, trong mọi sản phẩm thiết kế. Tính hiện đại, nghiêm túc khiến font chữ này được dùng để diễn đạt sự trưởng thành và thành đạt. Có rất nhiều kiểu cách được thiết kế cho font chữ outline này, từ lớn tới nhỏ, đậm tới nhạt, nghiêng, handmade, sharp, và nhiều hơn nữa.
6. Font chữ Serif – có chân có độ tương phản cao
Có một font chữ, mà nó là sự kết hợp của sự nổi bật, thu hút mọi ánh nhìn, với tính trang nhã, lịch thiệp. Đó chính là những phông có chân có độ tương phản cao (high-contrast serif font). Trong năm 2022, nó thực sự là một cơn sốt và có mặt ở khắp mọi nơi.
Sự tương phản ở đây đến từ khía cạnh về chiều rộng: Một phần các ký tự có xu hướng mỏng hơn so với phần còn lại. Hai phần có sự tương phản cực lớn, tạo sự khác biệt rõ nét, đồng thời làm nổi bật lẫn nhau.
Chính sự tương phản này tạo nên những thiết kế chữ cực đậm, mà sang trọng. Sử dụng phong cách typography này, bản thiết kế của bạn sẽ được nâng lên một tầm cao mới.
7. Quirky fonts – đáng yêu, vui tươi
Một thiết kế mang đầy nét tinh nghịch và đáng yêu trong năm 2022, đó chính là những quirky fonts (thường là những font được thiết kế không theo nhiều khuôn mẫu, mang tính ngẫu hứng và thể hiện tính tươi vui, tinh nghịch). Chúng vừa có nét “vụng về”, lại vô cùng đáng yêu và dễ mến. Quirky font mang tới cho người xem cảm giác bất ngờ, vui vẻ bởi sự thoải mái và tự nhiên mà nó đem lại.
Xu hướng font chữ Quirky thích hợp với những nội dung nhẹ nhàng, hài hước, mang ý nghĩa khích lệ, đủ để làm người xem nở 1 nụ cười trên môi. Những ấn phẩm thiết kế sử dụng Quirky font thường đem lại cho người xem một trải nghiệm tươi mới và lạc quan.
8. Messy fonts – Lộn xộn, cá tính
Xu hướng font chữ Messy (Những font mang tính lộn xộn, xù xì có thể coi là “trai hư” trong họ nhà Typography) là một trường hợp đặc biệt trong Typography. Vậy mà đến năm 2022, nó lại trở thành xu hướng được vạn người mê. Vẻ đẹp của nó thật đặc biệt: Đó là sự phá cách, bỏ mọi quy tắc về cái đẹp mà bạn từng biết.
9. Hand-lettering font độc đáo
Hand-lettering là một biến thể trong các font chữ viết tay. Nó được sinh ra dựa trên những nét bút lên xuống đậm nhạt của bút lông kim. Hand-lettering mang những quy tắc hoàn toàn khác biệt so với những Typography thông thường. Năm 2022, những thiết kế độc lạ và cá tính nổi bật lên như một xu thế mới. Chính vì thế, hand-lettering là “nhân vật cuối” chốt lại bảng danh sách top 9 những xu hướng font chữ hot nhất năm 2022.
Hand-lettering rất đa dạng, nó có nhiều hình dáng, kích thước và phong cách khác nhau, Nhưng quan trọng hơn cả, chúng đem lại cho bạn cảm giác độc nhất, là thứ duy nhất mà bạn có thể lồng ghép những tính cách của riêng bạn vào trong thương hiệu và các sản phẩm thiết kế.
2022: “Mọi thứ đều có thể xảy ra”
Sự sáng tạo của các nhà thiết kế lại được đẩy tới ranh giới mới. Chúng ta sáng tạo và tái sáng tạo! Ở 2022, mọi thứ đều có thể xảy ra. Với những font chữ lớn, cho tới những font bổ trợ, từ mang đậm tính truyền thống, cho tới những font “kỹ thuật số 4.0.”, từ trang nhã đến lộn xộn mà quyến rũ. Tất cả nằm trong một tổng thể thống nhất. Trước sự đa dạng đến không ngờ, quyền lựa chọn là của bạn.
Ngoài ra, các Designer và Developer đừng bỏ lỡ cơ hội tìm hiểu thêm về các các xu hướng thu hút người dùng qua sự kiện Vietnam Mobile Day do TopDev tổ chức.
Fresher là title quen thuộc thường được dùng nhiều trong ngành công nghệ thông tin (IT). Bài viết này sẽ giúp các Developer đặc biệt là các bạn sinh viên sắp ra trường hiểu rõ fresher là gì, công việc của fresher có khác gì intern không? Cần có các kỹ năng gì để trở thành fresher. Tìm hiểu ngay!
Fresher là gì?
Fresher là những sinh viên mới ra trường, là nhân viên mới vào nghề, chưa có kinh nghiệm, mới chỉ đang bắt đầu làm quen với công việc. Tuy nhiên fresher là những người đã trang bị đầy đủ kiến thức căn bản cần có. Và cần một môi trường để thực hiện, triển khai, học hỏi và phát triển lên các kỹ năng chính và kỹ năng mềm.
Công việc của Fresher
Công việc của một fresher thường liên quan đến việc học hỏi, làm quen với môi trường làm việc và áp dụng các kiến thức đã học vào thực tế. Dưới đây là một số nhiệm vụ chính mà fresher có thể đảm nhận:
1. Học hỏi và làm quen với môi trường làm việc
Đào tạo: Tham gia các khóa đào tạo nội bộ của công ty để hiểu rõ hơn về quy trình làm việc, công nghệ và công cụ mà công ty sử dụng.
Quan sát và học hỏi từ đồng nghiệp: Tham gia vào các cuộc họp, thảo luận và các dự án nhỏ dưới sự hướng dẫn của các nhân viên có kinh nghiệm.
2. Thực hiện các nhiệm vụ cơ bản
Hỗ trợ dự án: Tham gia vào các dự án thực tế dưới sự giám sát của các quản lý hoặc nhân viên cấp cao, thực hiện các công việc cơ bản như viết mã, kiểm tra phần mềm, thu thập dữ liệu, v.v.
Viết báo cáo và tài liệu: Ghi chép lại các quy trình, kết quả làm việc và tạo tài liệu hướng dẫn.
3. Nâng cao kỹ năng chuyên môn
Thực hành kỹ năng: Áp dụng các kiến thức đã học vào công việc thực tế, từ đó rèn luyện và nâng cao kỹ năng chuyên môn.
Học thêm kỹ năng mới: Tìm hiểu và học hỏi các công nghệ, công cụ và phương pháp mới để cải thiện hiệu suất công việc.
4. Giao tiếp và làm việc nhóm
Giao tiếp với đồng nghiệp: Tương tác với các thành viên trong nhóm, học cách giao tiếp hiệu quả và xây dựng mối quan hệ làm việc tốt.
Tham gia các cuộc họp nhóm: Đóng góp ý kiến và ý tưởng trong các cuộc họp, giúp cải thiện quy trình làm việc và chất lượng sản phẩm.
5. Đáp ứng yêu cầu công việc
Hoàn thành nhiệm vụ đúng hạn: Đảm bảo hoàn thành các nhiệm vụ được giao đúng thời hạn và chất lượng yêu cầu.
Phản hồi và cải tiến: Nhận phản hồi từ quản lý và đồng nghiệp, từ đó cải thiện và phát triển kỹ năng và hiệu suất làm việc.
Mẫu mô tả công việc của Fresher Tester
Công việc của một fresher tester thường sẽ xoay quanh việc đảm bảo chất lượng phần mềm bằng cách phát hiện lỗi và đảm bảo rằng sản phẩm hoạt động theo yêu cầu. Dưới đây là một mô tả chi tiết về công việc của một fresher tester:
Đọc và hiểu các tài liệu yêu cầu dự án, đặc tả kỹ thuật và thiết kế phần mềm
Phân tích các yêu cầu của dự án để xác định các trường hợp kiểm thử cần thiết
Thiết kế và viết các test case chi tiết, bao gồm các bước thực hiện, dữ liệu đầu vào và kết quả mong đợi
Thực hiện các test case thủ công, kiểm tra tính năng phần mềm và ghi lại kết quả kiểm thử
Học và sử dụng các công cụ kiểm thử tự động để viết và thực hiện các kịch bản kiểm thử tự động
Ghi nhận và báo cáo các lỗi phát hiện được trong quá trình kiểm thử, bao gồm mô tả chi tiết lỗi, bước tái hiện lỗi và ảnh chụp màn hình nếu cần
Tham gia các cuộc họp nhóm, sprint planning, và daily stand-ups để cập nhật tiến độ công việc và thảo luận về các vấn đề phát sinh
Phối hợp chặt chẽ với Dev, Designer và các thành viên khác trong nhóm dự án để đảm bảo hiểu rõ các yêu cầu và tiêu chí kiểm thử.
Kỹ năng và tố chất cần có ở một Fresher là gì?
Dưới đây là một số kỹ năng và tố chất quan trọng để bạn trở thành một Fresher giỏi:
Tinh thần học hỏi: Là một Fresher bạn sẽ có cơ hội được tham gia vào nhiều dự án cụ thể. Do đó, bạn phải luôn trong trạng thái sẵn sàng học hỏi những điều mới. Tích lũy kinh nghiệm làm việc và nâng cao kỹ năng sẽ giúp ích cho bạn trên con đường phát triển sự nghiệp.
Khả năng tìm hiểu: Lập trình là một công việc liên tục đòi hỏi bạn phải tìm hiểu về những thứ mới mẻ. Fresher cần có khả năng tìm hiểu và khả năng học hỏi để hiểu và áp dụng các công nghệ mới.
Tư duy logic và sáng tạo: Lập trình đòi hỏi bạn phải suy nghĩ logic để giải quyết vấn đề. Tư duy logic cần thiết để phân tích và giải quyết các vấn đề lập trình. Bên cạnh đó, tính sáng tạo sẽ giúp bạn tạo ra các giải pháp mới và phát triển các ứng dụng hoàn thiện hơn.
Kỹ năng giải quyết vấn đề: Khi làm việc với mã nguồn, bạn sẽ gặp phải nhiều vấn đề khác nhau. Kỹ năng này là yếu tố quan trọng trong việc giải quyết các vấn đề và tìm ra những giải pháp tốt nhất.
Kỹ năng làm việc nhóm: Lập trình không chỉ là công việc cá nhân, đôi lúc bạn cần phải làm việc với cả đội nhóm. Kỹ năng làm việc nhóm bao gồm khả năng giao tiếp, tiếp thu và chia sẻ kiến thức, phối hợp với những người khác để hoàn thành một dự án.
Kiên trì và sự chăm chỉ: Lập trình đòi hỏi bạn phải tận tâm và kiên trì để giải quyết các vấn đề. Fresher cần phải có khả năng chịu áp lực và sẵn sàng làm việc chăm chỉ để đạt được mục tiêu của mình.
Fresher đã nắm rõ các kiến thức căn bản về lập trình hoặc framework của ngôn ngữ nào đó phù hợp với dự án. Ví dụ một fresher cho vị trí lập trình Php thường phải biết về Html, Css, Jquery và đương nhiên là ngôn ngữ Php, cao hơn 1 chút là biết sử dụng framework Php như Laravel chẳng hạn…đó là điều kiện tối thiểu cho vị trí Fresher IT.
Tất nhiên đây chỉ là những hiểu biết căn bản, gọi là Fresher chính là vì họ còn thiếu nhiều kinh nghiệm thực chiến, kinh nghiệm về thiết kế phần mềm, database…họ thường đối mặt với những thách thức thực tế bởi dự án được giao, từ nó mà tích lũy dần kinh nghiệm làm việc.
Fresher cũng chính là vị trí nhân viên chính thức của công ty, được hưởng đầy đủ phúc lợi của công ty. Rất nhiều công ty IT sẵn sàng trả mức lương hậu hĩnh khi họ thấy được tiềm năng phát triển của bạn.
Intern lập trình dùng thường là những ai đang trong giai đoạn thực tập. Vẫn chưa có đầy đủ chuyên môn, kiến thức và sẽ nhận được sự hướng dẫn của các anh chị có kinh nghiệm trong công ty. Tất nhiên là bạn đang trong quá trình học nên bạn chỉ nhận được mức lương gọi là hỗ trợ ăn uống đi lại, phúc lợi lớn nhất là những kiến thức thực chiến quý giá cũng như đường hướng tương lai được nhận từ thời gian thực tập này.
Hiện nay tại Việt Nam rất nhiều công ty IT lớn có các chương trình tuyển dụng internship, fresher như công ty Framgia (Nay là Sun* Inc.), công ty KMS, Fpt Software, TMA.
Bạn nên đi thực tập từ năm 3 hoặc năm 4 đại học để tích lũy dần kinh nghiệm, đó là cách để chúng ta đạt tới các mức level cao hơn như junior, senior trong quá trình làm việc, để đạt được mức lương cũng như đãi ngộ mà mình mong muốn.
Bảng so sánh chi tiết Fresher và Intern
Intern
Fresher
Khái niệm
Intern là sinh viên hoặc người mới tốt nghiệp đang thực tập để học hỏi kinh nghiệm
Fresher là người mới tốt nghiệp, chưa có nhiều kinh nghiệm làm việc
Trình độ chuyên môn
Thường có kiến thức cơ bản về lập trình, đang học hỏi để nâng cao kỹ năng
Đã có trình độ chuyên môn nhất định, cần phát triển nhiều hơn về kỹ năng và kinh nghiệm
Lương thưởng
Thường được trả lương thấp hơn so với nhân viên chính thức
Thường được trả lương cao hơn so với intern và được hưởng nhiều chế độ phúc lợi hơn
Trách nhiệm công việc
Thường được giao những công việc đơn giản để học hỏi kinh nghiệm
Thường được giao những công việc phức tạp hơn, đòi hỏi kỹ sử dụng nhiều kỹ năng và có deadline rõ ràng
Làm sao để trở thành fresher ngay khi chưa ra trường?
Để trở thành một fresher mà không cần phải trải qua giai đoạn thực tập (intern), bạn có thể làm theo các bước sau:
Hoàn thành các môn chuyên ngành liên quan đến lĩnh vực bạn quan tâm có project ấn tượng để trình bày trong CV.
Tham gia các khóa học trực tuyến trên các nền tảng như Coursera, Udemy, LinkedIn Learning để nắm vững các kỹ năng cần thiết.
Tạo và hoàn thành các dự án cá nhân liên quan đến lĩnh vực bạn muốn làm việc. Ví dụ, nếu bạn muốn làm trong lĩnh vực phát triển phần mềm, hãy xây dựng các ứng dụng hoặc trang web cá nhân.
Đăng tải và quản lý các dự án của bạn trên GitHub hoặc các nền tảng tương tự để minh chứng cho kỹ năng và kinh nghiệm của bạn.
Tham dự các sự kiện, hội thảo, và gặp gỡ chuyên gia trong ngành để mở rộng mạng lưới quan hệ và tìm kiếm cơ hội nghề nghiệp.
Tìm kiếm và ứng tuyển trực tiếp vào các vị trí fresher thông qua các trang tuyển dụng, website công ty hoặc qua các mối quan hệ nghề nghiệp.
Hy vọng rằng bài viết này đã giúp bạn phân biệt được Intern và Fresher, hiểu rõ các kỹ năng và công việc của một Fresher. Đừng quên truy cập TopDev để cập nhật các công việc lập trình dành cho Intern và Fresher hấp dẫn nhất.
Ngôn ngữ lập trình C là một trong những ngôn ngữ lập trình được ưa chuộng nhất hiện nay, từ các dự án nhỏ đến các dự án lớn và phức tạp. Cùng TopDev tìm hiểu tất tần tật về ngôn ngữ lập trình này, bên cạnh đó chúng tôi cũng tổng hợp một số tài liệu và cách học lập trình C hiệu quả nhất.
Khái niệm ngôn ngữ lập trình C
Ngôn ngữ lập trình C là một ngôn ngữ lập trình bậc cao, đa chức năng (general-purpose), cung cấp giao diện trực tiếp, nhất quán và mạnh mẽ cho các hệ thống lập trình. Đây là lý do vì sao ngôn ngữ C được áp dụng rộng rãi trong việc phát triển phần mềm hệ thống, phần mềm ứng dụng và các hệ thống nhúng.
Sự linh hoạt và mạnh mẽ của ngôn ngữ C khiến nó được gọi là “mẹ của mọi ngôn ngữ”. Nhiều ngôn ngữ lập trình khác được phát triển dựa trên C như C++, PHP, JavaScript, Java, Python, và Perl.
Bởi vì là một ngôn ngữ có tính chất general-purpose, C có khả năng thích ứng tốt với phát triển hệ thống, ví dụ như hệ điều hành, trình biên dịch và trình điều khiển mạng. Tuy nhiên một số người cho rằng cú pháp của C có thể phức tạp và khó học, trong khi những người khác nhấn mạnh vấn đề thiếu chuẩn hóa. Cùng tìm hiểu sâu hơn về ngôn ngữ lập trình C ở các phần tiếp theo cũng TopDev!
Lịch sử hình thành và phát triển của C programming language
Lịch sử hình thành và phát triển của ngôn ngữ lập trình C
Nguồn ảnh: unstop.com
Ngôn ngữ lập trình C được đặt tên như vậy để ám chỉ sự kế thừa và phát triển từ ngôn ngữ lập trình B, một ngôn ngữ được thiết kế trước đó. C bổ sung hệ thống kiểu dữ liệu, cho phép ngôn ngữ này trở nên nhẹ hơn và cơ bản hơn so với BCPL (Basic Combined Programming Language)
Ngôn ngữ C được phát triển bởi Dennis Ritchie vào năm 1972 tại Bell Labs. Ban đầu, nó được dùng để viết hệ điều hành Unix. C bao gồm bốn kiểu dữ liệu nguyên thủy cơ bản: char, int, float, và void.
Vào năm 1978, Brian Kernighan và Dennis Ritchie viết cuốn sách “The C Programming Language” giúp ngôn ngữ C trở nên phổ biến hơn. Cuốn sách này cũng đóng vai trò quan trọng trong việc định hình cú pháp và các tiêu chuẩn sử dụng cho ngôn ngữ C.
Năm 1983, ANSI (American National Standards Institute) thành lập một nhóm làm việc để tiêu chuẩn hóa ngôn ngữ C, dẫn đến việc xuất bản tiêu chuẩn ANSI C vào năm 1989. Tiêu chuẩn này quy định cú pháp và các tính năng cơ bản của ngôn ngữ C, giúp cho việc phát triển và duy trì mã nguồn trở nên dễ dàng hơn.
Các đặc điểm chính của ngôn ngữ C
Đa mục đích (General-purpose): C là một ngôn ngữ lập trình đa mục đích, được thiết kế để phát triển nhiều loại ứng dụng khác nhau, từ hệ điều hành, phần mềm nhúng đến các ứng dụng cấp cao như trò chơi và phần mềm doanh nghiệp.
Tính di động (Portability):Chương trình viết bằng C có thể dễ dàng biên dịch và chạy trên nhiều hệ thống và nền tảng khác nhau mà không cần phải thay đổi mã nguồn, nhờ đó C trở thành một ngôn ngữ phổ biến trong việc phát triển các ứng dụng đa nền tảng.
Hỗ trợ lập trình cấu trúc (Structured Programming): C hỗ trợ lập trình cấu trúc, giúp các nhà phát triển tổ chức mã nguồn một cách logic và dễ quản lý, với các khái niệm như hàm, vòng lặp, và điều kiện.
Truy cập cấp thấp (Low-level access): C cho phép truy cập trực tiếp vào bộ nhớ và phần cứng, giúp tối ưu hóa hiệu suất và cho phép lập trình viên kiểm soát tốt hơn các tài nguyên của hệ thống.
Hệ thống kiểu mạnh mẽ (Strong typing system): C cung cấp một hệ thống kiểu mạnh mẽ, với các kiểu dữ liệu cơ bản như char, int, float, và void, giúp quản lý bộ nhớ và dữ liệu một cách hiệu quả.
Bộ từ khóa nhỏ (Small set of keywords): C chỉ có 32 từ khóa, làm cho ngôn ngữ này trở nên đơn giản và dễ học, nhưng vẫn đủ mạnh để xây dựng các ứng dụng phức tạp.
Thư viện chuẩn phong phú (Rich Standard Library): Ngôn ngữ C đi kèm với một thư viện chuẩn phong phú, cung cấp các hàm hữu ích cho các tác vụ như xử lý chuỗi, quản lý bộ nhớ, và thao tác với tệp tin.
Hỗ trợ con trỏ (Pointer Support): C hỗ trợ con trỏ, cho phép lập trình viên làm việc trực tiếp với địa chỉ bộ nhớ, một tính năng quan trọng để quản lý bộ nhớ động, thao tác với mảng và chuỗi.
Tối ưu hóa hiệu suất (Performance Optimization): C được biết đến với khả năng tối ưu hóa hiệu suất cao, nhờ vào khả năng kiểm soát chi tiết hoạt động của phần cứng, giúp các chương trình viết bằng C chạy nhanh và hiệu quả.
Khả năng mở rộng (Extendibility): C cho phép người dùng thêm các hàm mới vào thư viện chuẩn, tạo ra các thư viện tùy chỉnh cho các tác vụ cụ thể, làm cho việc quản lý mã phức tạp trở nên dễ dàng hơn.
Ngôn ngữ lập trình C hoạt động như thế nào?
Máy tính không nói cùng ngôn ngữ với chúng ta, vì vậy ta phải dịch human code sang computer code (hệ nhị phân 1 và 0). Ngôn ngữ lập trình C hoạt động bằng cách viết mã của bạn vào một tệp thực thi (.exe). Trình biên dịch C sẽ lấy tệp thực thi đó và chuyển đổi toàn bộ thành mã máy (machine code), sau đó máy tính sẽ chạy đoạn mã đã được biên dịch.
Dưới đây là cách ngôn ngữ C hoạt động qua các giai đoạn:
Giai đoạn 1: Chỉnh sửa mã nguồn (Editing)
Việc viết hoặc chỉnh sửa mã nguồn là giai đoạn đầu tiên trong việc xây dựng một ứng dụng bằng C. Mã nguồn là một tập tin văn bản chứa tất cả các lệnh cần thực thi bởi máy tính (có thể hiểu được bởi con người). Chúng ta có thể sử dụng trình soạn thảo văn bản đơn giản (như Notepad) hoặc trình chỉnh sửa tích hợp trong các môi trường phát triển tích hợp (IDE). Mã nguồn phải tuân theo cú pháp của ngôn ngữ lập trình C. Sau khi hoàn thành, tập tin mã nguồn được lưu với phần mở rộng là *.c.
Để biên dịch mã nguồn, chúng ta cần một trình biên dịch (compiler). Nếu sử dụng một trình soạn thảo văn bản đơn giản, chúng ta cần cài đặt một trình biên dịch C trên máy tính và chạy nó thủ công từ dòng lệnh. Một cách dễ dàng hơn là sử dụng một IDE (thường đi kèm với trình biên dịch) và chỉ cần nhấn một nút trong menu để bắt đầu biên dịch.
Giai đoạn 2: Tiền xử lý và biên dịch (Preprocessing and Compilation)
Trong quá trình biên dịch, có một giai đoạn xử lý sơ bộ được thực hiện trước khi biên dịch mã nguồn. Trình tiền xử lý (preprocessor) được gọi bởi trình biên dịch để thực hiện công việc tiền xử lý. Trình tiền xử lý tìm kiếm các dòng mã bắt đầu bằng ký tự # (hash).
Một trong những nhiệm vụ của trình tiền xử lý là bao gồm các hàm được khai báo bên ngoài mã nguồn của chúng ta. Trình tiền xử lý sẽ loại bỏ tất cả các chỉ thị của trình biên dịch khỏi mã gốc nhưng vẫn giữ thông tin về các tập tin bổ sung cần thiết sau này. Một tập tin tạm thời sẽ được tạo ra vào cuối quá trình tiền xử lý, và tập tin này sẽ được ẩn khỏi người dùng.
Sau khi tiền xử lý hoàn tất, trình biên dịch bắt đầu hoạt động. Trình biên dịch sẽ chuyển đổi tập tin mã nguồn thành một tập tin đối tượng. Tập tin đối tượng này, còn được gọi là mã máy (machine code), có thể được CPU của máy tính hoặc vi điều khiển diễn giải.
Mặc dù tập tin đối tượng đã hoàn thành, nhưng vẫn còn một số tham chiếu chưa được định nghĩa. Các tham chiếu chưa định nghĩa này là những đoạn mã cần được lấy từ một vị trí khác. Trong ví dụ của chúng ta, hàm printf() là một tham chiếu chưa định nghĩa. Chúng ta biết nơi lấy mã cho hàm này vì chỉ thị của trình biên dịch (#include <stdio.h>) đã đề cập đến nó.
stdio.h là một tập tin tiêu đề (header file) chứa khai báo cho hàm printf() của chúng ta, cùng với các nội dung khác. Bằng cách bao gồm tập tin tiêu đề, chúng ta mô tả nơi để lấy định nghĩa của hàm printf().
Giai đoạn 3: Liên kết (Linking)
Tại điểm này, chúng ta cần thu thập tất cả các tập tin cần thiết cho ứng dụng của mình. Đối với các hàm bên ngoài, chúng ta sẽ cần các tập tin đối tượng cũng như các tập tin thư viện tĩnh. Các hàm bên ngoài được sử dụng trong tập tin mã nguồn của chúng ta được định nghĩa trong các tập tin thư viện tĩnh (có phần mở rộng là *.lib). Trong ví dụ của chúng ta, mã máy cho hàm printf() sẽ được lưu trữ trong tập tin thư viện tĩnh.
Trình liên kết (linker) là người thực hiện quá trình liên kết. Nó sẽ kiểm tra tất cả các tập tin đối tượng để tìm các tham chiếu chưa định nghĩa và thay thế chúng bằng mã máy từ các tập tin thư viện. Cuối cùng, chúng ta sẽ có một tập tin thực thi (thường có phần mở rộng là *.exe đối với ứng dụng trên Windows, *.hex đối với vi điều khiển) sau khi quá trình liên kết hoàn tất.
Giai đoạn 4: Tải và thực thi chương trình (Loading and Execution)
Sau khi tập tin chương trình được tạo, nó phải được nạp vào bộ nhớ của máy tính trước khi có thể thực thi. Trình tải (loader) chịu trách nhiệm cho việc này. Trình tải thường được tích hợp trong tập tin thực thi bởi trình liên kết. Khi chúng ta khởi chạy tập tin thực thi, nó kích hoạt trình tải, trình này sẽ nạp chương trình vào bộ nhớ và bắt đầu thực thi.
Tại sao lập trình viên nào cũng nên học lập trình C?
Có rất nhiều ngôn ngữ lập trình hiện đại hiện nay để lựa chọn như Perl, Ruby, và Python, Java. Tuy nhiên, có một số lý do thuyết phục để bạn nên nắm vững ngôn ngữ lập trình C.
Trước hết, C đã được các lập trình viên sử dụng trong suốt ba thập kỷ qua, với một lượng lớn mã nguồn có sẵn để tham khảo và học tập. Nhờ đó, bạn có thể dễ dàng tiếp cận kiến thức và thực hành, đồng thời giải quyết các vấn đề đã được cộng đồng lập trình giải quyết và hiểu rõ. Ngoài ra, có rất nhiều tài liệu hướng dẫn chi tiết dễ dàng truy cập.
C đã trở thành một ngôn ngữ lập trình phổ biến nhờ vào lịch sử lâu đời và vai trò quan trọng trong lập trình hệ thống cho Unix. C là một công cụ mạnh mẽ để diễn tả các khái niệm lập trình cơ bản theo cách mà nhiều người có thể dễ dàng hiểu. Nhiều khái niệm trong C, như argc và argv cho các tham số dòng lệnh, cấu trúc vòng lặp và kiểu dữ liệu, cũng xuất hiện trong nhiều ngôn ngữ khác, giúp bạn giao tiếp dễ dàng hơn với những người khác, ngay cả khi họ không biết ngôn ngữ C.
Hơn nữa, C cho phép bạn tiếp cận gần hơn với phần cứng máy tính. Khi làm việc với con trỏ, byte, và các bit, các phương pháp tối ưu hóa trở nên rõ ràng hơn. Hiểu cách hoạt động chi tiết của hệ thống rất hữu ích khi bạn gặp phải những vấn đề trong các ngôn ngữ bậc cao, vì bạn sẽ có cái nhìn sâu hơn về cách thức hoạt động của hệ thống, giúp việc khắc phục sự cố trở nên dễ dàng hơn.
C có 32 từ khóa, nhiều kiểu dữ liệu và một tập hợp các hàm hệ thống, làm cho việc lập trình trở nên đơn giản hơn.
Một điểm mạnh khác của C là khả năng mở rộng dễ dàng. Bạn có thể tích hợp các hàm từ thư viện vào chương trình C, và tự thêm các tính năng hay hàm riêng của mình vào thư viện đó. Điều này làm cho việc quản lý mã nguồn phức tạp trở nên đơn giản hơn rất nhiều.
Cuối cùng, có nhiều trình biên dịch khác nhau có sẵn trên thị trường, giúp bạn dễ dàng chạy các chương trình viết bằng C trên nhiều nền tảng khác nhau.
Ngôn ngữ lập trình C có rất nhiều ứng dụng quan trọng và đa dạng trong ngành công nghiệp và nghiên cứu. Dưới đây là một số ứng dụng chính của ngôn ngữ C:
Phát triển Hệ điều hành: C là ngôn ngữ chủ đạo được sử dụng để phát triển các hệ điều hành như Unix, Linux và Windows. Nhờ vào tính năng tiếp cận trực tiếp với phần cứng và hiệu suất cao, C là lựa chọn lý tưởng để xây dựng và quản lý các hệ thống phần cứng phức tạp.
Phần mềm nhúng (Embedded Software): Với tính năng di động và khả năng tối ưu hóa hiệu suất, C thường được sử dụng trong việc phát triển phần mềm nhúng cho các thiết bị điện tử thông minh, hệ thống điều khiển tự động, và IoT (Internet of Things).
Phát triển ứng dụng hệ thống: Có sự linh hoạt và khả năng tương thích cao, C được sử dụng rộng rãi trong việc phát triển các ứng dụng hệ thống như trình duyệt web, máy chủ, và các phần mềm đa nền tảng.
Lập trình mạng: Cung cấp các thư viện và công cụ mạnh mẽ cho việc phát triển ứng dụng mạng, từ các giao thức mạng đơn giản đến các ứng dụng phức tạp như máy chủ email và hệ thống phân phối nội dung.
Công cụ di động và game: Có thể sử dụng để phát triển các ứng dụng di động và game, đặc biệt là trong lĩnh vực game console và game đa nền tảng.
Công cụ hệ thống và bảo mật: Được sử dụng để viết các công cụ hệ thống như trình biên dịch, trình gỡ lỗi và phần mềm bảo mật, bao gồm cả các công cụ phân tích và thử nghiệm bảo mật.
Nghiên cứu và giáo dục: Là một trong những ngôn ngữ lập trình cơ bản và phổ biến trong giảng dạy và nghiên cứu khoa học máy tính, C giúp sinh viên và nhà nghiên cứu hiểu sâu hơn về cấu trúc và hoạt động của máy tính.
Những ứng dụng trên chỉ ra rằng ngôn ngữ lập trình C không chỉ phổ biến mà còn cực kỳ linh hoạt và mạnh mẽ trong nhiều lĩnh vực công nghệ thông tin và kỹ thuật.
Cách học lập trình C hiệu quả cho người mới
Phương pháp học C hiệu quả
Học lập trình C không phải là chuyện mà ta có thể làm trong một sớm, một chiều, nhưng nó không phải là quá khó khăn. Sau đây là 4 lời khuyên cho bạn khi muốn trở thành một C developer:
Xem code sample
Khi bạn mới bắt đầu học lập trình C, bạn nên cố gắng hiểu từng ví dụ, đọc và hiểu các đoạn code mà tác giả đã viết dùng để làm gì. Tuy các ví dụ đó không phải khi nào đánh vào máy cũng chạy, nhưng nó tập cho chúng ta một thoái quen xem code cẩn thận và góp phần giúp chúng ta viết code rõ ràng hơn.
Chúng ta phải viết code làm sao để cho các lập trình viên khác có thể đọc và hiểu nó, và để khi chính mình nhìn lại cũng nắm được. Do đó cần phải tuân thủ những nguyên tắc, và cú pháp khi viết code để đảm bảo kiểm tra lỗi đơn giản hơn, các phần hướng dẫn viết code theo một mẫu chuẩn.
Hãy chạy thử nó
Chạy thử ở đây không phải là copy rồi paste vào rồi nhấn F5. Bạn nên tự mình gõ từng đoạn code đó vào chương trình biên dịch, vì khi đó bạn thực sự buộc mình phải đi qua tất cả các dòng code, việc gõ code sẽ giúp bạn chú ý đến các chi tiết cú pháp của ngôn ngữ – những sự thiếu sót buồn cười như thiếu đấu chấm phẩy ở cuối mỗi câu lệnh có thể làm bạn hết sức đau đầu. Nhưng đó là những gì bạn cần phải vấp ngã, rồi bạn sẽ có kinh nghiệm sau những lần đau đó.
Sau khi gõ code xong, hãy chạy thử nó, sau đó thử thêm thắt vào đoạn code mà mình muốn. Điều đó sẽ giúp bạn hiểu nhanh hơn mỗi câu lệnh có ý nghĩa như thế nào.
Hãy tự mình ngẫm nghĩ và code riêng cho mình 1 chương trình ngay
Bạn hãy tự nghĩ cho mình một thuật toán riêng, một chương trình nào đó. Tuy việc này rất khó và tốn nhiều thời gian, nhưng nó sẽ giúp bạn có được những kinh nghiệm thực sự hữu ích, khả năng tư duy lập trình ngày càng phát triển. Thay vì lên mạng tìm code về sửa.
Nếu ý tưởng làm một ứng dụng lớn, phải viết một lượng lớn code. Khi đó bạn hãy chia nhỏ project thành nhiều tính năng, tự thiết kế cấu trúc và code của chức năng đó, rồi xong xuôi bạn map các tính năng lại cho hoàn chỉnh. Sẽ thất bại nhiều đó, tin tôi đi, nhưng đừng nản, khi bạn chạy ra được thành quả thì nó sẽ tiếp thêm động lực cho bạn.
Nhớ sử dụng rành rọt một công cụ Debug
Debug là một công cụ chỉ ra cho bạn chạy sai dòng nào đó hay lỗi nào đó. Nó cho bạn theo dõi giá trị của các biến và các thay đổi của chúng qua từng dòng code của chương trình. Công cụ debug giúp chúng ta hiểu chương trình của mình hơn, và là thứ chúng ta cần phải biết khi viết chương trình.
Khi bạn lần đầu tìm hiểu về debuger, có thể nó sẽ làm bạn mất khá nhiều thời gian khi bạn sửa lỗi chương trình của mình. Nhưng khi bạn nắm được các kiến thức về debug nó sẽ đem lại cho bạn một lợi ích lớn trong việc tiết kiệm thời gian khi sửa lỗi chương trình.
Tổng hợp lộ trình học C từ căn bản đến nâng cao
Tương tự như các ngôn ngữ lập trình khác, lộ trình học của bạn nên bắt đầu từ việc đọc và tìm hiểu các cú pháp cơ bản trong C, từ kiểu dữ liệu, cách khai báo biến,… sau đó là về các câu lệnh điều kiện(if-else, switch), vòng lặp (for, while). Sau đó nâng cao hơn sẽ là những kiến thức liên quan đến bộ nhớ, cấp phát động, con trỏ,… Bạn có thể tuân theo một lộ trình cơ bản như dưới đây:
1. Giới thiệu và chuẩn bị
C là gì?: Tìm hiểu về ngôn ngữ lập trình C, lịch sử phát triển và ứng dụng thực tiễn trong lập trình hệ thống, phần mềm nhúng, và các ứng dụng khác.
Cài đặt môi trường phát triển: Cài đặt một IDE (Integrated Development Environment) như Code::Blocks, Dev-C++ và trình biên dịch như MinGW, hoặc Visual Studio để viết và chạy mã C mà không cần trình biên dịch
2. Cơ bản về ngôn ngữ lập trình C
Cấu trúc chương trình C: Hiểu cấu trúc cơ bản của một chương trình C, gồm các phần như #include, hàm main(), và các lệnh cơ bản.
Cú pháp C cơ bản: Học về cú pháp ngôn ngữ C, cách viết và tổ chức mã nguồn theo đúng quy chuẩn.
Kiểu dữ liệu trong C: Nắm vững các kiểu dữ liệu cơ bản trong C như int, float, char, và void.
Biến: Học cách khai báo, khởi tạo và sử dụng biến để lưu trữ và xử lý dữ liệu.
Hằng số: Tìm hiểu về hằng số và cách sử dụng chúng trong chương trình để giữ giá trị cố định.
Lớp lưu trữ (Storage Classes): Hiểu về các lớp lưu trữ như auto, extern, static, và register, cách chúng ảnh hưởng đến phạm vi và thời gian sống của biến.
3. Các khái niệm lập trình cơ bản
Toán tử: Sử dụng các toán tử số học, logic, quan hệ và gán để thực hiện các phép tính và so sánh trong chương trình.
Điều khiển luồng: Học cách sử dụng các câu lệnh điều kiện như if, else, và switch-case để điều khiển luồng chương trình.
Vòng lặp: Sử dụng các vòng lặp for, while, và do-while để lặp lại các đoạn mã theo điều kiện.
Hàm: Định nghĩa và gọi hàm, làm việc với tham số và giá trị trả về của hàm.
Quy tắc phạm vi (Scope Rules): Hiểu về phạm vi biến và quy tắc sử dụng biến toàn cục và cục bộ trong các hàm và tệp tin khác nhau.
4. Làm việc với dữ liệu phức tạp
Mảng (Array): Khai báo và sử dụng mảng một chiều và hai chiều để lưu trữ tập hợp các giá trị có cùng kiểu dữ liệu.
Con trỏ (Pointer): Hiểu về con trỏ, cách sử dụng chúng để quản lý bộ nhớ và làm việc với mảng, chuỗi.
Chuỗi (String): Xử lý chuỗi ký tự, sử dụng các hàm thao tác chuỗi như strlen(), strcpy(), strcmp() để làm việc với chuỗi.
Cấu trúc (Struct): Sử dụng cấu trúc để nhóm các biến khác nhau thành một đơn vị duy nhất, dễ quản lý.
Union: Hiểu về Union và cách sử dụng nó để tiết kiệm bộ nhớ trong các ứng dụng yêu cầu tối ưu hóa.
Các trường Bit (Bit Fields): Làm việc với các trường bit trong cấu trúc để quản lý dữ liệu ở mức độ bit, tiết kiệm bộ nhớ.
5. Cấu trúc và quản lý chương trình
Từ khóa typedef: Sử dụng typedef để tạo các kiểu dữ liệu mới từ các kiểu dữ liệu có sẵn, giúp mã nguồn dễ đọc hơn.
Input & Output cơ bản: Sử dụng printf() và scanf() để nhập và xuất dữ liệu từ người dùng.
Nhập/Xuất File: Làm việc với tệp tin, sử dụng các hàm như fopen(), fclose(), fprintf(), và fscanf() để đọc và ghi dữ liệu từ/tới tệp tin.
Bộ tiền xử lý (Preprocessor): Sử dụng các chỉ thị tiền xử lý như #define, #include, #ifdef để điều khiển quá trình biên dịch, tái sử dụng mã nguồn.
Header File: Tạo và sử dụng các tệp tiêu đề (.h files) để tổ chức mã nguồn, chia sẻ các khai báo hàm và biến giữa các tệp mã nguồn.
6. Các khái niệm nâng cao
Ép kiểu (Type Casting): Hiểu về ép kiểu và cách sử dụng nó để chuyển đổi giữa các kiểu dữ liệu khác nhau một cách an toàn.
Xử lý lỗi (Error Handling): Phát hiện và xử lý lỗi trong chương trình để đảm bảo chương trình chạy ổn định và tin cậy.
Đệ quy (Recursion): Hiểu về đệ quy và cách viết các hàm đệ quy để giải quyết các vấn đề phức tạp, như tính giai thừa, dãy Fibonacci.
Tham số biến (Variable Arguments): Sử dụng các hàm với số lượng tham số không cố định, ví dụ như printf() trong C.
Quản lý bộ nhớ (Memory Management): Sử dụng các hàm cấp phát (malloc(), calloc(), realloc()) và giải phóng bộ nhớ (free()) để quản lý bộ nhớ động trong chương trình.
Tham số dòng lệnh (Command Line Arguments): Xử lý các tham số dòng lệnh được truyền vào khi chạy chương trình, sử dụng argc và argv.
7. Thực hành và phát triển dự án
Dự án thực tế: Áp dụng những kiến thức đã học để xây dựng các dự án nhỏ như quản lý sinh viên, chương trình tính toán ma trận, hoặc một trò chơi đơn giản.
Tiếp tục học hỏi và thực hành: Tham gia các diễn đàn lập trình, cộng đồng mã nguồn mở để trao đổi, học hỏi kinh nghiệm từ những lập trình viên khác.
8. Cải thiện và mở rộng kiến thức
Thuật toán và cấu trúc dữ liệu nâng cao: Học thêm về các thuật toán sắp xếp, tìm kiếm, và cấu trúc dữ liệu nâng cao như danh sách liên kết, cây nhị phân, đồ thị.
Lập trình hệ thống và mạng: Nâng cao kỹ năng lập trình bằng cách tìm hiểu về lập trình hệ thống, quản lý bộ nhớ ở mức thấp, và lập trình mạng.
Học các ngôn ngữ lập trình khác: Sau khi đã nắm vững C, mở rộng kiến thức bằng cách học các ngôn ngữ lập trình liên quan như C++, Python, hoặc Java để mở rộng khả năng phát triển phần mềm.
Dưới đây là tổng hợp một số series dạy lập trình C miễn phí trên Youtube:
C Programming For Beginners” – by freeCodeCamp.org
C Programming Tutorial for Beginners” – by ProgrammingKnowledge
Learn C Programming | C Tutorial | Complete Playlist” – by Naresh i Technologies
C Programming Language” – by The Cherno
C Programming Tutorials for Beginners” – by Caleb Curry
Tóm lại, C là một ngôn ngữ lập trình mạnh mẽ, linh hoạt, có tính ứng dụng cao dùng để viết nhiều chương trình từ hệ điều hành đến ứng dụng người dùng, đồng thời C cũng là nền tảng cho nhiều ngôn ngữ lập trình hiện đại khác. Bài viết trên của chúng tôi, hi vọng đã cung cấp được những kiến thức căn bản về ngôn ngữ C và cách tự học lập trình C cho người mới bắt đầu.
Khi Siobhán, đồng nghiệp của tôi nói rằng cô ấy muốn làm phân tích và dữ liệu viên (data science), tôi nhận ra đó là cơ hội để mình quan sát cách học và làm việc của lập trình viên trẻ ngày nay.
Trước hết, để tôi giới thiệu một chút về bản thân. tôi đảm nhiệm vị trí quản lí manager bên developer và engineering vì thế mà tôi luôn làm việc với những bạn đã có rất nhiều kinh nghiệm. Thế nhưng đối với các bạn trẻ chỉ mới chập chững bước vào thế giới lập trình, tôi luôn tự hỏi các bạn đã bắt đầu từ đâu và từ khi nào. Tôi thì vốn đã đụng vào lập trình ngay từ khi chỉ là đứa con nít.
Đồng nghiệp của tôi, Siobhán, thì quyết định theo đuổi nghề lập trình sau khi đã hoàn thành khóa học phân tích dữ liệu tại Udacity tháng 2 vừa rồi. Đây là khóa học mà trước tiên bạn phải làm quen với CS, điều mà hoàn toàn xa lạ với Siobhán cho tới mùa hè năm ngoái (thời điểm cô ấy đăng kí học). Nói cách khác, Siobhán chưa đụng vào bất cứ dòng code nào trước đó. Chính vì vậy mà trong khoảng thời gian đầu, tôi đảm nhiêm vai trò huấn luyện cho Siobhán. Tôi cung cấp các tài liệu khác nhau từ nhiều nguồn (Khóa học CS50 của Harvard) và yêu cầu cô ấy nghiên cứu nhằm bổ sung thêm kiến thức.
Trong quá trình trên, Siobhán đã đưa ra rất nhiều thắc mắc như công dụng thực tế của text editor, command line cho đến việc máy tính hoạt động như thế nào. Một câu hỏi khá hay khác là “ Tại sao em phải dùng Chrome để vào Jupyter, khi mà cái ứng dụng đã có sẵn trên máy rồi? Không phải Chrome chỉ là trình duyệt web thôi à?” dẫn đến một cuộc thảo luận về cấu trúc Client/server, TCP/IP, HTTP cũng như là về loop back trong network.
Siobhán là một học sinh cực kì chăm chỉ, cô thức dậy và bắt đầu học từ lúc 6h sáng cho đến tận tối khuya. Vì vậy mà một thử thách đặt ra là làm sao đảm bảo cho Siobhán học hiệu quả mà không khiến cổ xì khói vì bị quá tải từ lượng thông tin dày đặc. Sau đây là cách mà “thầy trò” chúng tôi đã áp dụng:
Đầu tiên là lâu lâu phải để Siobhán ….. bị quá tải. Đó là cách tốt nhất để tối đa khả năng tiếp thu bài học của cô ấy. Hiển nhiên là chỉ để việc đó xảy trong thời gian ngắn nhất có thể. Khi bạn bị quá tải bởi khối lượng kiến thức khổng lồ, bạn sẽ cảm thấy mệt mỏi và mất đi động lực. Vì thế mỗi khi Siobhán cảm thấy cô ấy bị “overload” thì việc học sẽ được giảm xuống.
Tôi đã yêu cầu Siobhán lập ra một list những nội dung mà cô phải học ở Udacity:
Python / Jupyter
R / R Studio
VIM
git / GitHub
Các dòng lệnh command
Thống kê số liệu
matplotlib / pandas / NumPy / SciPi
JavaScript / D3
Học về CS cũng như các thuật toán
SQL / PostgreSQL
NoSQL / MongoDB
Udacity vốn nổi tiếng bởi số lượng phong phú các bài học cũng như chất lượng của những khóa học. Tuy nhiên, nhìn ở mặt khác, số lượng thông tin là cực kì lớn và nó khiến Siobhán có cảm giác bị choáng ngợp mỗi khi cô vừa hoàn thành một khóa học. Một ví dụ điển hình là chỉ mới vài tuần sau khi học xong lớp về JavaScript, D3 và cách lập trình. Siobhán đã phải chuyển một thế giới hoàn toàn khác lạ của R and RStudio và bỏ hẳn JavaScript về một bên.
Trong quá trình học, Siobhán đã thực hiện vô số các project khác nhau và học hỏi được rất nhiều thứ. Thế nhưng sau kết thúc chương trình học vào tháng 2 vừa rùi, Siobhán lại cảm thấy bị lung lay mất tự tin. Nói cách khác, cô cảm thấy đôi khi mình chả biết gì bởi việc học quá nhiều lĩnh vực mà lại không có chuyên môn tập trung. Hơn thế nữa, kinh nghiệm sử dụng các ngôn ngữ lập trình và tool của Siobhán vẫn còn thấp.
Vì thế mà tôi yêu cầu Siobhán dành ra vài tuần để thực hành. Mục tiêu đặt ra là thành thạo trong việc sử dụng Python, SQL, hệ thống phân tích dữ liệu trong khi vẫn tạo core CS và cập nhật số liệu. Cứ mỗi tuần trôi qua, Siobhán càng tự tin hơn vào khả năng của mình. Đồng thời, cô tập trung củng cố kiến thức của mình và lấp đi những lỗ hổng hiểu biết khác. Và cứ thế, mỗi lần Siobhán sử dụng Python, cô càng “pro” hơn.
Sau khi khoảng thời gian huấn luyện kết thúc, Siobhán được săn đón bởi nhiều công ty khác nhau. Cũng qua việc chỉ dạy Siobhán, tôi cũng nghiệm ra được nhiều điều:
Hãy thể hiện 1 thuật toán bằng ý tưởng
Như đã nói, cách dễ nhất để miêu tả một thuật toán là dưới dạng của một ý tưởng. Khi bạn gặp khó khăn trong việc viết một dòng code, hãy thử miêu tả nó bằng ngôn ngữ của bạn trước chứ không phải chỉ dùng Pseudocode (mã giả) thôi.
Hãy thử tưởng tượng bạn đang kiếm chuỗi palindromic dài nhất từ chuỗi chính. Và nếu chuỗi chính là aabbdcaacd thì chuỗi nhánh palindromic sẽ là dcaacd.
Sau đây là cách mà chúng ta giải quyết vấn đề, bằng ngôn ngữ tiếng Việt :
Bắt đầu bằng việc xác định chuỗi palindromic! Bởi chúng luôn là đối xứng đều, chúng ta có thể bắt đầu việc tìm kiếm từ vị trí trung tâm của đoạn chuỗi chính. Nói cách khác, là cái “hạt nhân” của chuỗi palindromic trong chuỗi chính.
Khi tìm được “hạt nhân” rùi thì ta cứ việc mở rộng ra hai bên cho đến khi nó không còn cân xứng đều với nhau nữa.
Dựa theo nguyên lí đó, ta có thể thấy một số chuỗi palindromic ngắn là aa và aba
Các chuỗi palindromic có thể trùng lên nhau. Ví dụ với chuỗi là aabaaba. Thì chuỗi palindromic aabaa xếp chồng lên nhau với chuỗi palindromic baab và aba
Sau khi có thể dùng ngôn ngữ giao tiếp hằng ngày để miêu tả hướng giải quyết vấn đề của bạn. Hãy lặp lại quá trình đó nhưng lần này là dùng Pseudocode. Bạn sẽ nhận ra rằng chúng sẽ trở nên đơn giản hơn. Quá trình trên cũng sẽ giúp bạn dễ nhớ và học lập trình tốt hơn.
Học cách nhìn code
Học lập trình không chỉ đơn giản là viết code, nó còn về khả năng nhìn một phần mềm về mặt cấu trúc , cách vận hành cũng như lỗi. Nói cách khác, đừng chỉ đọc code như mặt chữ, mà phải nhìn.
Lúc đầu, bạn sẽ chỉ đơn giản là cố gắng hiểu được cú pháp của những dòng code. Khi đã quen dần, bạn sẽ nhận ra những lỗi trong các đoạn code. Và sau một thời gian, bạn sẽ có khả năng nhận ra có gì đó “sai sai” dù chỉ nhìn sơ qua. Và trước cả khi bạn nhận ra, các lỗi và bug trong code sẽ tự động hiện ra trước mắt bạn.
Kĩ thuật rút ngắn code
Là một kĩ thuật được nói tới bởi nhà lập trình Sandi Metz. Theo cô, các đoạn code cần có sự chú ý về mặt hình dáng, màu sắc nhằm xác định có cần phải rút ngắn hay không. Với những dòng code mà trông cứ như là một dãi loằng ngoằng bậc thang; nhiều màu sắc thì chúng sẽ cần ta sửa lại bằng kĩ thuật trên.
Bắt đầu bằng việc viết thành thạo 50 dòng code
Theo tôi, khi các bạn học lập trình thì mốc then chốt ban đầu là phải lập trình được một phần mềm đơn giản với 50 dòng code. Bởi trong giai đoạn này, bạn sẽ học về cách tạo các khối dữ liệu, loop cũng như là các dòng code điều kiện thế nên việc lập trình ngắn gọn là cần thiết.
Nếu bạn thành thục được kĩ năng trên, thì việc thành pro sẽ trở nên rất dễ dàng. Bạn có thể thực tập bằng cách giải các thử thách lập trình được tạo ra trên Leetcode và Cracking Coding Interview.
Sau một thời gian thuần thục với việc lập trình cho những phần mềm đơn giản thì bạn đã sẵn sàng bước tiếp vào level cao hơn.
Giữ cho những đoạn code của phần mềm đơn giản và dễ hiểu
Về lý thuyết, nếu đến được bước này thì bạn đã có thể lập trình được bất kì ứng dụng nào. Có khi bạn lại còn thấy lập trình dễ hẳn ra.
Khi trình độ của bạn đã đi lên thì tiêu chuẩn đặt ra cũng cao hơn. Bạn sẽ bắt đầu lập trình nhiều phần mềm phức tạp và cần sử dụng nhiều kĩ thuật khác nhau. Rõ ràng là bạn sẽ muốn đơn giản hóa đi các dòng code nên bạn sẽ bắt đầu phải tinh tế hơn, trừu tượng và rút gọn đi nhằm giữ cho các đoạn code được đơn giản mà ngắn gọn. Bạn sẽ dành nhiều thời gian hơn trong việc testing cũng như việc bạn đặt tên trong lập trình.
“Đơn giản là hiện thân của sự chắc chắn” – Edsger W.Dijkstra
Hãy tập thói quen viết test
Viết test cần skill cao nhưng nó cũng dễ dàng để học được. Viết test sẽ tạo cho bạn thói quen kĩ lưỡng, thường xuyên test.
Bắt đầu bằng việc lập trình bài test cho một thử thách bất kì. Sau đó bạn thử thay đổi thông số (0 hoặc 1 hoặc để trống) nhằm xem bài test bạn tạo ra có hoạt động tốt không.
Nhớ ghi note đầy đủ
Các developer nên mang theo bên mình một bản note để ghi chép. Bởi khi bạn đang lập trình, sẽ có rất nhiều thứ bạn gặp phải mà không tiện giải quyết ngay. Vì thế khi có bất cứ vấn đề, thắc mắc mà bạn muốn tìm hiểu sau thì hãy ghi ra. Sau đây là những đoạn note của Siobhán:
Tại sao đoạn code Python luôn bị sai khi mình Paste nó vào VIM!
if __name__ == '__main__': là cái gì vậy? Nó để làm gì?
Tại sao cứ phải xác định Class cho unittest?
Lời kết
Điều quan trọng nhất đối với Siobhán là lập trình hàng ngày bởi chúng tôi vẫn còn vài tuần nữa trước khi cô ấy bắt đầu tìm kiếm việc làm full time. Tất nhiên là Siobhán vẫn sẽ phải tập viết lập trình liên tục kể cả khi cô ấy đã kiếm được việc. Tuy vậy, khi thấy Siobhán hạnh phúc vì sự tiến bộ của mình, tôi cũng vui lây. Sau vài tháng chỉ dạy cho cô ấy, tôi cũng tìm thấy lại sự phấn khích trong việc lập trình. Một công việc thật tuyệt vời.
Tôi đã làm việc trong ngành phát triển phần mềm và công nghệ được khoảng 5 năm. Trước đây tôi theo ngành Environmental Engineering. Tôi chuyển sang học Software Developer cùng lúc chỉ cần thêm một vài môn vì tôi đã từng học GIS trước kia.
Và đó là khi tôi bước vào một chân trời mới. Vừa có kiến thức thực tiễn, lại vừa khao khát được học thêm về một ngách riêng hấp dẫn trong ngành lập trình. Công việc hiện tại của tôi là một lập trình viên GIS Web.
Liệu tôi có làm việc với GIS và web nhiều hơn không? Chắc chắn là có rồi. Tôi có biết cách xử lý front-end và back-end cho mấy cái ứng dụng của mình không? Có, và theo một cách nào đó, bạn có thể gọi tôi là một lập trình viên full-stack. Nhưng nó có nghĩa là tôi “cái gì cũng biết thật ra lại không biết cái gì” không?
Không! Tôi có thể nói rằng tôi đủ vững trong lĩnh vực công nghệ, nhưng cũng có thể thoải mái “quẩy” trong một số lĩnh vực khác. Bỏ qua cái mác công việc một bên, một cách nào đó tôi cảm thấy thoải mái hơn khi làm việc trong môi trường back-end cùng bộ dữ liệu khổng lồ. Tuy nhiên bài viết này tôi sẽ nói về một vấn đề khác.
Tôi làm lập trình web, vì đúng là tôi có kiến thức về công nghệ web, nhưng tôi cũng có kiến thức chuyên ngành nhất định về GIS. Tôi hiểu được sự khác biệt giữa hình chiếu và hệ toạ độ.
Tôi làm khá nhiều với các hệ thống xây dựng dựa trên ArcGIS cho máy chủ và Công cụ cơ sở dữ liệu không gian ArcGIS của ESRI. Tôi không chỉ đủ khả năng nhận được một công việc nào đó, mà còn có thể nhận được công việc với mức lương rất cạnh tranh.
Tôi thấy không có nhiều lập trình viên có thêm chuyên môn “ngách” này, và điều này làm tôi có giá trị hơn trong mắt những nhà tuyển dụng đang tìm kiếm ứng viên có chuyên môn khác biệt như vậy.
Hãy tìm lối đi riêng cho mình
Tôi không nói các bạn đọc bài viết này đi tìm hiểu về GIS. Điều tôi muốn nói ở đây là việc bạn nên tìm hiểu những kiến thức đặc biệt hoặc khác biệt trong ngành nghề của mình. Đơn giản như trở thành một Dotnet Core REST API, hay có thể phát triển hệ thống tích hợp nếu bạn thực sự thích, hoặc cũng có thể tìm hiểu về blockchain,…
Mấu chốt ở đây là tìm ra thứ có thể giúp bạn khác biệt với những người khác và tập trung vào nó, và học những thứ bạn cần trong khi vẫn theo lĩnh vực chính của mình. Tôi nghĩ là hầu hết các công ty đang tìm kiếm người mà khi họ đưa bảng mô tả công việc, người đó không chỉ có thể làm hết tất cả mọi thứ trong cái mô tả công việc đó. Họ đang tìm kiếm người có thể giải quyết những vấn đề cụ thể nào đó. Và đó là cách mà bạn “bán thân”.
Có thể bạn sẽ không đồng ý với tôi về việc bạn đang “bán thân”, nhưng thực tế thì bạn đang đổi phần lớn tài nguyên có giá trị của mình (ở đây là thời gian) để lấy tiền. Vậy nên bạn cũng có thể đầu tư tối đa cho quỹ thời gian của mình để chuyển thành “đô la”.
Tìm cái gì đó mà bạn đam mê, nhưng cũng phải “bán” được. Tìm những vấn đề khác biệt và cụ thể và bắt đầu tập trung vào những gì giúp bạn giải quyết các vấn đề đó. Có thể là bảo mật ứng dụng web, hoặc là chuyển ứng dụng sang công nghệ không có máy chủ trên AWS? Hoặc có thể là về React/Redux và SPA’s,… tôi không biết, nhưng đừng tìm hiểu chung chung.
Tìm hiểu chung chung cũng được, nhưng bạn nên tìm một kỹ thuật đặc biệt nào đó rồi phát triển theo. Tôi có thể yêu cầu một mức lương cao hơn nhiều ở vị trí hiện tại vì tôi có thể giải quyết một vài vấn đề đặc thù liên quan đến GIS một cách nhanh chóng mà không cần phải tìm hiểu gì nữa.
Làm lập trình theo mô hình “chữ T”
Một góc nhìn khác mà tôi muốn nói đến có liên quan đến phương pháp “chữ T”. Bạn có thể có bề rộng về kiến thức, nhưng phải có sự chuyên sâu cho một lĩnh vực đặc thù nào đó, giống cái hình tôi vẽ ở trên. Bạn phải hiểu là công việc của bạn dù là front-end hay back-end thì cũng không ảnh hưởng gì đến những lĩnh vực khác trong lập trình.
Cách để sống chuẩn chữ T
Tôi nghĩ là phương pháp này không chỉ áp dụng được rất nhiều cho ngành lập trình mà còn có thể áp dụng trong đời sống, và đây là một số cách để đạt được phương pháp “chữ T”:
Luôn học hỏi, kiên trì và không ngừng theo đuổi kiến thức.
Luôn chớp lấy cơ hội để phát triển, kể cả nếu bạn nghĩ là mình không đủ tiêu chuẩn.
Tìm nguồn động lực cho mình hoặc những điều gì có thể thôi thúc bạn tập trung.
Phản trực quan để tìm trọng tâm
Nghe có vẻ khá bất bình thường lúc đầu, nhưng bạn nên suy nghĩ về nó. Có những vấn đề đặc thù nào mà bạn có thể giải quyết bằng lập trình hoặc công nghệ không? Đó cũng sẽ là cách để bạn sử dụng thời gian và năng lượng hiệu quả nhất.
Tìm hiểu tổng quát để tìm được điều mà bạn thật sự đam mê, mặc dù nghe không vui lắm, nhưng hãy tìm kiếm thứ mà bạn đam mê và đắm chìm trong nó. Tôi đã từng đọc được là nếu bạn dành 5 tiếng một ngày đọc về một môn học cụ thể nào đó, chỉ sau 2 năm bạn có thể trở thành chuyên gia ở môn đó.
Nói một cách khác, có thể ngay lúc này bạn chưa nhận được gì, nhưng nó sẽ tích luỹ dần theo thời gian và sau một giai đoạn ngắn, bạn sẽ bắt đầu nhận ra được nhiều thứ hơn bạn tưởng.