BÀN VỀ FUNCTIONAL PROGRAMMING VÀ OOP PROGRAMMING – bài 1

Cách đây mấy hôm tôi có đưa ra một khảo sát xem mọi người sẽ theo hướng FP hay OOP, vì hay gặp cảnh tranh cãi giữa hai trường phái này. Và thường các cuộc tranh cãi đều không có hồi kết, đơn giản vì ai cũng có lý lẽ của mình, và quan trọng nhất là không có ai có thể đưa ra được những lý do xác đáng để bên kia tin theo.

Trong bài này tôi sẽ mặc nhiên coi các bạn đã hiểu về OOP, và sẽ nói một chút về FP (vì trong blog này chưa có bài nào nói về nó). Nếu như bạn chưa thực sự biết rõ cả OOP lẫn FP thì tất cả những lý lẽ đưa ra sẽ đều là cảm tính, do đó quan điểm đưa ra sẽ dễ trở nên phiến diện và không thuyết phục.

Nhớ tìm đọc lại các bài OOP nếu bạn vẫn chưa nắm rõ nhé ❤️.

ℹ️ Vậy Functional Programming là gì?

Continue reading “BÀN VỀ FUNCTIONAL PROGRAMMING VÀ OOP PROGRAMMING – bài 1”

NÓI THÊM MỘT CHÚT VỀ THREAD

Trong các ứng dụng single thread, ta chỉ có duy nhất một thread chạy trong một không gian địa chỉ (1), do vậy ta có thể đảm bảo không ai thay đổi dữ liệu trong suốt quá trình chạy. Tuy nhiên trong các ứng dụng multi-thread sẽ có 2 hoặc nhiều hơn thread chạy đồng thời và chia sẻ chung không gian địa chỉ, do vậy một trong những bài toán quan trọng nhất là đồng bộ dữ liệu dùng chung giữa các thread.

Nên lưu ý khái niệm chạy đồng thời ở đây là tương đối, vì một máy tính có thể chỉ có rất ít CPU, nên nó phải chia sẻ giữa nhiều thread khác nhau. Trong thực tế, số thread luôn lớn hơn số CPU có trong hệ thống, trong một thời điểm có vài trăm đến vài ngàn thread chạy đồng thời là điều bình thường, mỗi thread sẽ chỉ được cấp một khoảng thời gian để chạy (gọi là time slide), sau đó HĐH sẽ lấy lại quyền điều khiển và chuyển sang thread khác.

Continue reading “NÓI THÊM MỘT CHÚT VỀ THREAD”

KINH NGHIỆM BẠN CÓ TỪ ĐÂU?

Bạn đã học xong đại học chưa? Rồi ư, giờ là lúc bước ra đường và nhận lấy cái tát đầu tiên từ cuộc đời!

PHẢI CÓ KINH NGHIỆM MỚI KIẾM ĐƯỢC VIỆC 😱

Phải đi làm mới có kinh nghiệm, phải có kinh nghiệm mới tìm được việc làm. Bạn không cô đơn đâu, chỉ cần lướt nhẹ qua các diễn đàn, sẽ thấy ngay có rất nhiều người giống bạn. Vậy phải làm gì?

Trước tiên, ta phải thống nhất 1 với nhau một điều: bạn chỉ là một người mới bước chân vào một trò chơi có hàng triệu người tham gia, bạn đang đứng đâu đó ở cuối dãy, và quan trọng nhất sẽ chẳng có ai lắng nghe “tâm tư, nguyện vọng” đó cả. Đó là quy tắc của cuộc chơi và bạn sẽ phải theo, dù muốn hay không. Nếu với tư cách nhà tuyển dụng, tôi có thể chia sẻ với bạn vài điều:

👉 Trong ngành phần mềm, kinh nghiệm rất quan trọng, vì bạn luôn phải làm việc trên những thứ không hoàn hảo, thậm chí đôi khi không tốt cho lắm: Windows, Linux, Apache, Mysql, PHP, NodeJS, React Native… tất cả đều không hoàn hảo, vậy nên nhận vào một người đã biết bệnh các thứ trên sẽ giúp tiết kiệm thời gian rất nhiều.

Continue reading “KINH NGHIỆM BẠN CÓ TỪ ĐÂU?”

NÊN DẠY PASCAL HAY C TRONG NHÀ TRƯỜNG?

Đọc được một bài viết của một bạn nào đó nói về việc thay thế Pascal trong nhà trường bằng một ngôn ngữ khác, mình cũng muốn viết vài ý về điều này.

👉 Thứ nhất, phải khẳng định một điều là kiến thức về giáo dục và công nghệ phần mềm của chúng ta còn kém rất xa so với những chuyên gia trong ngành. Khi các bạn tranh cãi OOP hay functional programing hay hơn, thì họ đang thiết kế ra các ngôn ngữ và viết các trình biên dịch, khi ta đọc được một bài viết về cấu trúc đĩa cứng (và cảm thấy mình thật giỏi) thì cách đó mười năm họ đã kiếm tiền bằng cách viết các driver cho hệ điều hành, và khi ta chợt “phát hiện” ra học lập trình với Python hay hơn Pascal thì họ đã đào tạo hàng trăm hàng trăm hàng ngàn kỹ sư phần mềm rồi.

Bạn không tưởng tượng được nó xa đến mức nào đâu!

Cách đây rất lâu, khi tôi có cơ hội làm việc chung với một chuyên gia đầu ngành về nhận dạng ảnh/video, thầy ấy đã giới thiệu một số đề tài tiến sĩ mà thầy hướng dẫn, là những bài toán như nhận dạng chữ viết tay, nhận dạng khuôn mặt, đọc ảnh thiên văn và tính toán khoảng cách các thiên thể… và họ đã nghiên cứu những thứ như vậy từ hơn 20 năm trước.

Continue reading “NÊN DẠY PASCAL HAY C TRONG NHÀ TRƯỜNG?”

THREAD POOL

Khi mới học viết các ứng dụng multi thread, mỗi khi cần xử lý một công việc song song, ta thường làm theo cách sau:

– Tạo một thread mới.

– Truyền tham số khởi tạo và cho thread chạy để xử lý công việc.

– Kết thúc thread và nhận kết quả.

Một trong những bài toán phổ biến nhất cho người mới bắt đầu là viết ứng dụng chat(*). Và cách làm cũng tương tự như trên:

– Mở server socket và listen trên server socket đó.

– Mỗi khi có một client kết nối mới, bạn sẽ tạo một thread để chờ dữ liệu trên kết nối đó, nếu có thì xử lý, hoặc gửi dữ liệu cho đầu bên kia thông qua socket.

– Khi hai bên hoàn thành công việc, ngắt kết nối và kết thúc thread.

👉 Cách làm này khá đơn giản, nhưng có một số nhược điểm như sau:

Continue reading “THREAD POOL”

LẬP TRÌNH MULTI THREAD

Vậy là ta đã xong OOP, con trỏ và các phần nói về quản lý bộ nhớ, giờ tiếp đến một chủ đề nữa: lập trình đa luồng – multi thread programming.Trong bài này tôi chỉ giới thiệu qua các khái niệm cơ bản và các từ chuyên ngành liên quan, để dễ nhất các bạn nên đọc lại những bài viết về chủ đề quản lý bộ nhớ (stack, heap) và bài về từ khóa virtual trong OOP.

ℹ️ Trước tiên ta cần hiểu thread là gì

Về kỹ thuật, một thread là một chuỗi các lệnh cần được thực thi bởi CPU, hay ta có thể tưởng tượng một thread là một function, trong đó chứa các lệnh thực thi, và quan trọng nhất – nó sẽ chạy ĐỒNG THỜI với chương trình chính.Bạn có thể thấy, chương trình sẽ bắt đầu bằng hàm main, Main, hay với nhiều ngôn ngữ là từ câu lệnh đầu tiên. Mỗi khi bạn gọi một function, bạn sẽ phải chờ nó kết thúc, giờ mỗi khi gọi một hàm, nó sẽ được thực thi bởi một CPU khác, vì ta có 2 CPU nên hàm chính và hàm được gọi sẽ chạy đồng thời với nhau.

❓Bạn sẽ đặt câu hỏi: Nếu máy của tôi chỉ có 1 CPU, vậy làm sao tôi có thể chạy đa luồng được?

ℹ️ Đó là nhiệm vụ của hệ điều hành, với các hệ điều hành đa nhiệm (multi tasking OS), nó sẽ có những cách sau để cho phép bạn chạy 2 thread cùng lúc.

Continue reading “LẬP TRÌNH MULTI THREAD”

NÓI THÊM VỀ BÀI “BỘ NHỚ STACK LÀ GÌ?”

Giải thích về ghi chú 2: Trong hình minh họa ta sẽ thấy Stack nằm lộn ngược từ trên xuống, đó cũng là cách bộ nhớ Stack được tổ chức trong thực tế, nhờ phát triển từ địa chỉ cao xuống địa chỉ thấp mà CPU có thể phát hiện ra lỗi Stack overflow một cách dễ dàng (so sánh với 0).

Continue reading “NÓI THÊM VỀ BÀI “BỘ NHỚ STACK LÀ GÌ?””

BỘ NHỚ HEAP LÀ GÌ?

Khi học về con trỏ, bạn sẽ thường xuyên phải xin cấp phát và giải phóng bộ nhớ, vậy những vùng nhớ này được quản lý bởi ai và như thế nào?

Về cơ bản, khi khởi động lên, hệ điều hành sẽ nắm quyền kiểm soát toàn bộ bộ nhớ, bởi bộ nhớ có thể coi như một sân chơi chung nên phải có phải có người cầm trịch, quản lý xem chỗ nào đã có người dùng, chỗ nào còn trống, tránh việc dữ liệu của một chương trình này bị ghi đè bởi một chương trình khác.Khi bạn gọi hàm malloc, hoặc new, trình quản lý bộ nhớ sẽ tìm xem chỗ nào chưa có ai sử dụng, nó lấy một phần vừa đủ với kích thước bạn xin cấp phát, đánh dấu vùng nhớ đó đã được cấp cho chương trình (process) của bạn và trả về địa chỉ. Nhiệm vụ của bạn là lưu lại địa chỉ (vào một biến con trỏ) và chỉ sử dụng trong phạm vi đã được cấp.Khi bạn yêu cầu delete, trình quản lý bộ nhớ sẽ gỡ bỏ đánh dấu. Lúc này nếu tiếp tục sử dụng, chương trình của bạn có thể bị lỗi truy cập vùng nhớ không được phép và bị kết thúc.

ℹ️ Tất cả các thao tác xin cấp phát và giải phóng này đều làm việc trên một vùng nhớ gọi là HEAP. Ta hiểu đơn giản heap là vùng nhớ còn lại sau khi đã trừ đi các phần khác của chương trình như code, dữ liệu tĩnh, stack…Việc cấp phát/sử dụng/giải phóng một vùng nhớ luôn phải làm cẩn thận vì:

Continue reading “BỘ NHỚ HEAP LÀ GÌ?”

LÀM VIỆC Ở NAUY

Có nhiều bạn còn đi học vẫn thắc mắc không biết khi đi làm thì thế nào, vậy để tôi kể cho các bạn nghe về một ngày của tôi nhé 🙂.

Như đã từng kể trước đây, tôi hiện đang làm trong một nhóm phát triển phần mềm về quản lý vận tải, một mảng trong logistics. Bạn tưởng tượng đang làm chủ một công ty có 20 xe container, 40 tài xế, chuyên chở hàng hóa theo hợp đồng cho các siêu thị, các công ty bán lẻ, cửa hàng trực tuyến, công ty xây dựng… Bạn muốn quản lý các đơn hàng, hợp đồng, muốn biết chính xác xe nào đang ở đâu, trạng thái hàng hóa thế nào. Bạn cũng muốn cho phép khách hàng biết được chính xác từng món đã đi tới đâu, khi nào có thể nhận được… Vậy là bạn đang cần đến một phần mềm như chúng tôi cung cấp. Chúng tôi có các ứng dụng cho trung tâm điều hành, web app, các ứng dụng trên iOS và Android cho tài xế, khách hàng, thậm chí có cả ứng dụng tích hợp trên các xe tải.

Continue reading “LÀM VIỆC Ở NAUY”

TÍNH TRỪU TƯỢNG

Tính trừu tượng – mới nghe đã thấy mệt mỏi rồi 🥴.

Như trong những bài viết trước, ta đã thấy trừu tượng là khái niệm mà chúng ta luôn cố gắng hiện thực khi xây dựng phần mềm.

Nói một cách đơn giản, trừu tượng cho phép ta làm việc với các thành phần khác mà không cần quan tâm chúng được xây dựng như thế nào, không cần biết bên trong một lớp người ta viết gì và chúng ta không cần phải quan tâm đằng sau chúng có những thành phần nào để chạy.

Trong OOP, với bài toán quản lý sinh viên, ta tạo ra một lớp cha StudentStore, trong đó có 2 phương thức Find and Save, dùng để tìm và lưu trữ thông tin về các sinh viên.Trong phiên bản đầu tiên, Find và Save sẽ đọc và lưu lại thông tin vào các file trên đĩa. Nhưng đến khi bạn học sang phần Sql Server, bạn muốn lưu trữ vào cơ sở dữ liệu thay cho file, vì tất nhiên làm việc với dữ liệu trên file sẽ cực nhọc và kém hiệu quả hơn nhiều. Lúc đó bạn sẽ làm gì?

Continue reading “TÍNH TRỪU TƯỢNG”