IceTea Việt | Lập trình cuộc sống

Bài viết mới nhất


Chào các bạn, để tiếp nối với phần 1 - React là gì và tại sao nó lại quan trọng? mình sẽ viết tiếp phần 2 về React Native.




GIỚI THIỆU


React Native hiểu đơn giản chính là React cùng với native component.


Được Facebook release ra vào năm 2015, React Native cho phép bạn tạo các ứng dụng di động chỉ với Javascript và React. React Native có kiến trúc thiết kế tương tự như React, cho phép bạn thiết kế, tái sử dụng các UI phong phú từ các component mặc định và các component đến từ đóng góp của người dùng.
React Native dù chỉ mới ra đời 2 năm, nhưng đã nhận được sự quan tâm không kém cạnh gì đàn anh React. Tại Github repo, React Native nhận được hơn 48k stars, cùng với 1316 contributors – thậm chí còn nhiều hơn React. Hiện nay, ở các diễn đàn công nghệ, conference, Mobile summit, Facebook group thì React Native luôn là chủ đề nóng bỏng được đưa ra thảo luận và dần trở thành một xu thế công nghệ.



VẤN ĐỀ & GIẢI PHÁP

Hiện nay theo sự phát triển của xã hội, nhu cầu tạo ra một ứng dụng mobiles và ứng dụng web đồng nhất và nhanh nhất ngày càng tăng. Tuy nhiên do rào cản nền tảng và mong muốn đó chưa được thực hiện.
Thời gian gần đây xuất hiện nhiều framework cho phép sử dụng các ngôn ngữ chạy trên web để phát triển ứng dụng mobile hay còn gọi là cross-platform development như PhoneGap, Ionic, Cordova,.. tuy nhiên ứng dụng tạo ra chỉ đạt đến mức hybrid-app, sử dụng các Webviews để hiển thị giao diện lên chứ không thực sự là native.


Việc sử dụng các ứng dụng hybrid làm giảm hiệu năngkhông tối ưu trong việc xử lý.
Google cũng công bố cho mình một hướng tiếp cận khác, hoàn toàn bỏ đi native app mà sử dụng Progressive Web App (PWA), tuy hiệu năng khá tốt, nhưng vẫn không thể nào so sánh được với native app khi ứng dụng trở nên lớn hơn, mặt khác PWA được cho là khó giữ lại người dùng hơn là native app.


React Native cung cấp cho bạn một thứ hoàn toàn khác biệt, ứng dụng được tạo ra sẽ hoàn toàn native với hiệu năng cao, chứ không phải là “mobile web app”, “HTML5 app” hay “hybrid app”. Bạn có thể build một ứng dụng mobile mà khó có thể phân biệt được nó với các native app khác tạo hoàn toàn bằng Java hay Swift/Objective-C. React Native sử dụng các UI hoàn toàn giống với iOS hay Android app thông thường, điều đặc biệt là nó được xây dựng dễ dàng hơn thông qua Javascript và React.

TẠI SAO PHẢI SỬ DỤNG REACT NATIVE?

React Native trở nên phổ biến như vậy là vì nó ăn theo đàn anh React vốn đang làm mưa làm gió trong lĩnh vực CNTT?




Không!


React Native không có: Controllers, Derectives, Templates, Global Event Listener, Models, View-Models,.. Vậy tại sao lại chọn React Native mà không phải các framework khác?


Bởi vì React Native có Component.




Component của React Native được kế thừa từ React, và nó đóng vai trò như hạt nhân thúc đẩy React và React Native phát triển, với khả năng tái sử dụng và quản lý giao diện, Component API được xem như là tương lai của thiết kế UI trên web và mobile.

  • Thực sự native
Đa phần ứng dụng mobile viết bằng Javascript hiện nay sử dụng Cordova hoặc các framework xây dựng trên nền Cordova như Ionic, Sencha Touch,... Bạn có thể gọi các View giống hệt native ra tuy nhiên ứng dụng của bạn lại chỉ là một đống HTML/HTML5 và Js gói bên trong Webviews. Với React Native, nó cho phép bạn render các View của mình bằng chính true native API, bằng cách gọi chính sdk theo từng nền tảng để build ứng dụng.

  • Learn once write anywhere
React Native không theo đuổi việc "Write once, run anywhere" như các hybrid-app
Bởi vì Facebook nhận ra rằng với mỗi nền tảng khác nhau sẽ có mỗi giao diện, cảm nhận, khả năng khác nhau nên React Native vẫn hướng đến phát triển những ứng dụng riêng biệt cho từng platform để đem lại trải nghiệm tốt nhất cho người dùng.
React Native đi theo một mục đích là học một lần những cốt lõi của ReactJs, và sau đó áp dụng nó vào tất cả các project từ web app đến mobile app (Android, iOS) mà không cần học thêm một công nghệ khác nào – Learn once, write everywhere.
Với tư duy và nền tảng có được khi học React bạn có thể dễ dàng chuyển đổi giữa việc lập trình Web và lập trình ứng dụng mobile, đáp ứng công việc thực tế.
  • Live reloading – Hot reloading
React Native cho phép bạn xây dựng ứng dụng nhanh hơn, thay vì re-compiling, bạn có thể load lại giao diện của app ngay lập tức. Với Hot reloading, bạn còn thậm chí có thể xem ngay những thay đổi trên giao diện bằng cách vừa chạy app vừa code.


Điều này sẽ đẩy mạnh quá trình phát triển app và các máy tính yếu sẽ không còn gặp vấn đề build lại project nhiều lần, tốn thời gian chờ đợi và ảnh hưởng hiệu năng máy tính như khi lập trình Android/iOS bình thường.
  • Dễ dàng kết hợp với native code (Java, Swift,..)
React Native kết hợp mượt mà với các native component được viết từ Swift/Objective-C hay Java. Cực kì đơn giản để chuyển component từ React Native sang native code khi bạn cần optimize một số khía cạnh nhỏ của app theo hướng dẫn sau. Nó cũng cực kì dễ dàng khi build một phần của app bằng React Native và phần còn lại bằng trực tiếp bằng native code – đó cũng là cách mà Facebook, Tiki áp dụng cho app của họ.
  • Hiệu năng cao
React Native có tốc độ thực thi cao, mặc dù Js thì không thể chạy nhanh bằng native code được tuy nhiên vẫn có hướng overcome vấn đề hiệu năng này. Và trong phần lớn trường hợp React Native và Js có thể giữ cho app bạn chạy ở mức độ 60 khung hình/giây, và khó có thể phân biệt được với native app. 
Ở cấu trúc bên dưới, Js code chạy ở một thread riêng biệt với UI thread, vì vậy dù app có chạy với logic phức tạp đến mức nào thì UI vẫn cực kì mượt và không bị block bởi Js worker thread.
  • Dễ học
React Native có điểm mạnh là JSX code đẹp và dễ đọc. Trang documents viết chi tiết đầy đủ kèm cộng đồng (Facebook, meetup, React conferences,..) vững mạnh có thể hỗ trợ mọi lúc.
React Native cũng là chủ đề nóng bỏng được thảo luận và đăng tải thường xuyên, số lượng câu hỏi, tutorial, blog về React Native cũng đang tăng với số lượng chóng mặt, vì vậy thật dễ dàng để học hay tìm ra câu trả lời cho vấn đề bạn đang mắc phải.


SỬ DỤNG NHƯ THẾ NÀO?

Với chủ đề là React và Swift, mình xin hướng dẫn các bạn một số vấn đề với React Native và iOS development.

a. Getting started.
Để có thể sử dụng React Native cho iOS bạn cần phải có một máy tính cài đặt hệ điều hành MacOSX (có thể là máy ảo, hoặc máy Hackintosh).
Tiến hành cài đặt các dependencies cần thiết như NodeJSWatchman sử dụng Homebrew bằng cách chạy các dòng lệnh sau:

$ brew install node
$ brew install watchman

Tiếp theo, cài đặt React Native CLI (command line interface):

npm install -g react-native-cli

Cài đặt XCode thông qua Mac App Store. Nên cài Xcode phiên bản 8.0 hoặc cao hơn để đảm bảo tương thích với các tính năng mới của các bản release React Native gần đây.
Kiểm tra lại việc cài đặt bằng cách tạo và chạy thử một project:

react-native init AwesomeProject
cd AwesomeProject
react-native run-ios

Kết quả hiện ra trên máy ảo như sau:
Dòng lệnh chỉ là một cách để chạy ứng dụng của bạn. Ngoài ra bạn còn có thể chạy bằng cách nhấn trực tiếp phím Run trong Xcode hoặc trong Nuclide.

Thử thay đổi một vài giá trị trên giao diện bằng cách:
  • Mở file index.ios.js (hoặc index.android.js cho Android) bằng text editor và thử sửa dòng "Welcome to React Native!" thành tên của bạn.
  • Chọn trở lại máy ảo Simulator khi nãy và ấn tổ hợp phím Command + R để thực hiện Live reload và cập nhật thay đổi lên ứng dụng.
Vậy là bạn đã thành công trong việc tạo và chỉnh sửa một app React Native đầu tay cho mình rồi.

      b. Javascript “mới”
      
Hãy cùng mở lại file index.ios.js khi nãy và xem kĩ lại:


Có gì đó kì lạ ở đây, một cái gì đó không thực sự giống như Javascript???

Đừng hoang mang, đây là tương lai!

Đầu tiên ES2015 (hay ECMAScript 6, ES6) là một bộ cải thiện Javascript mà hiện nay đã trở thành chuẩn chung cho các lập trình viên. Nhiều tính năng của ES6 đã sẵn sàng cho các engine Js hiện đại. Bằng  cách sử dụng Babel, chúng ta có thể đảm bảo các tính năng của ES6 có thể chạy trên nhiều nền tảng khác nhau (Android, iOS, Windows,...)


Rất nhiều tính năng nổi bật của ES6 như:

 - Thay vì sử dụng var để khi báo biến cục bộ, ES6 sử dụng const và let,
 - Khai báo annonymous function bằng fat arrow (=>)
 - Chia source code ra thành nhiều module và sử dụng cú pháp import/export để quản lý.
 - Đăt giá trị mặc định cho tham số của hàm
 - …

Và quan trong hơn hết, ES6 bắt đầu có khái niệm JS classes. Trước đó “class” trong Js thực chất chỉ là các function với instance method được gán vào MyFunction.prototype.
ES6 cho phép ta sử dụng cú pháp đơn giản hơn với chỉ một từ khóa class. Class trong ES6 cho phép ta sử dụng các hàm có sẳn, viết thêm hàm, kế thừa và có cả constructor như class của các ngôn ngữ khác.


    c. JSX

Một điều kì lạ trong file index.ios.js demo ở trên là phần <Text>Hello world!</Text>. Như đã giải thích ở bài trước, đó là cú pháp của JSX, một cú pháp dành cho việc nhúng tag-based XML vào Javascript để sử dụng. Mỗi tag như  sẽ được chuyển đổi thành một lần gọi hàm  để tạo các component/element.
JSX giúp cho việc thiết kế giao diện trở nên dễ dàng hơn, dễ đọc hiểu và tưởng tượng ra được mình đang thiết kế UI gì.
Bạn không bắt buộc phải sử dụng JSX, tuy nhiên cách áp dụng này không có khuyết điểm nào và thực sự nên dùng.


d.   React component.

Component như đã nói ở trên, chính là cốt lõi của React, React Native, và là tương lai của công nghệ. React Native cho phép chúng ta xây dựng các Native UI Component đại diện cho các block của UI, và nhận nhiệm vụ mapping từ Js components sang native UI và render ra màn hình



Cả giao diện màn hình của thiết bị được vẽ như thế nào, bao gồm cả StatusBar, NavigationBar đều được qui định bởi các React Component. Thứ tự của các components trong cấu trúc cây của JSX cũng là thứ tự khi vẽ lên màn hình.
React Native hỗ trợ sẵn khá nhiều components tương ứng với các View cơ bản của iOS/Android. Danh sách có thể được xem tại đây.
Ngoài ra các React Component còn có thể tái sử dụng qua lại giữa Web và Mobile làm cho việc thống nhất hóa các trang web và ứng dụng của một công ty trở nên dễ dàng hơn bao giờ hết

e. Props

Nhiều component có thể được customize khi nó được tạo ra bằng nhiều thuộc tính khác nhau, những thuộc tính/tham số đó gọi là props.
Props có thể được hiểu như properties của một component, tất cả các component đều có thể có props dù đó là component cơ bản của React Native hay custom component do người dùng tạo ra. Props có thể được truy cập nội tại bên trong component, cho phép component đó biết nó phải hoạt động như thế nào, hiển thị thế nào lên màn hình.

Ví dụ với một component cơ bản của React Native là <Image>. Khi ta tạo một Image ta có thể sử dụng một props tên là “source” để kiểm soát cái gì sẽ được in ra màn hình.


Các React Component không thể tự thay đổi props của chính nó được, mà phải nhờ một component cha thiết lập thuộc tính cho nó, và giá trị đó sẽ cố định trong suốt vòng đời của component đó. Đối với các thuộc tính thường xuyên thay đổi hoặc muốn thay đổi trong nội tại component ta cần sử dụng một khái niệm khác, gọi là state.

e. State

Với State, ta có thể maintain trạng thái và các thuộc tính của nó ngay trong nội tại component. State cũng có thể truy cập trong nội tại của component, tuy nhiên không như props, các component cha có thể không truy cập được vào state của component con. 


Về tổng quát, bạn nên khởi tạo state ngay trong constructor của component, sau đó sử dụng hàm this.setState(object newState) để gán trạng thái cho component bất cứ khi nào bạn muốn. Và lưu ý rằng không nên truy cập và thay đổi trực tiếp bất cứ thuộc tính nào của state bằng cách gọi this.state.foo = ‘bar’, mà phải thực hiện thông qua hàm this.setState(‘bar’).


Ví dụ ta muốn làm một máy phiên dịch từ ngữ thành pizza thì có thể sử dụng this.state để lưu và chỉnh sửa những từ đã gõ. Ở đây mỗi khi ta nhập gì đó vào <TextInput> thì hàm onChangeText() sẽ gọi hàm this.setState() để gán giá trị text mới vào this.state.text. Ngay sau đó khi component được render ra màn hình, ta sẽ lấy this.state.text đó ra split, mapping thành những ký hiệu 🍕 và vẽ ra màn hình trong hàm render().


g.   Style

Với React Native, bạn không cần dùng thêm một ngôn ngữ nào (như CSS) để qui định style cho các component khi vẽ lên màn hình. Tất cả những thứ bạn cần là sử dụng Javascript để tạo ra các object chứa các giá trị cần cho style.
Tất cả các core component hỗ trợ bởi React Native đều chấp nhận một props tên là ‘style’
Các style name và giá trị được kế thừa từ CSS ngoài trừ việc chuyển sang sử dụng CamelCase để biểu thị. (Ví dụ: backgroundColor thay vì background-color của CSS). Điều đó tạo thuận lợi cho việc rút ngắn khoảng cách giữa lập trình mobile apps và web apps.
Một props chứa các giá trị của style có thể là một POJO (Plain Old Javascript Object) chứa một mảng các style. Tuy nhiên vì các component có thể phức tạp hơn khi project phát triển, để clean code ta thường sử dụng StyleSheet.create() để define nhiều styles cùng lúc



h. Networking


Nhiều mobile apps cần phải load tài nguyên từ remote URL. Bạn cần phải tạo các POST request đến các REST API, và tải dữ liệu về thông qua GET request. Hoặc đơn giản bạn chỉ cần fetch các dữ liệu tĩnh ở đâu đó trên Internet về (Vd: tải một hình ảnh tĩnh,..).

Networking trong React Native được tạo ra từ hai API chính: FetchXMLHttpRequest. Cả hai đều được thiết kế để tương thích với API của trình duyệt, vì vậy:

 - Lập trình viên Web không cần phải học một cách mới để tạo các network requests.
 - Các thư viện đều được xây dựng trên nền tảng của 2 API trên cho React Native.
  • Fetch API:
Dễ sử dụng, và ra đời với React Native, Fecth API là promise-based, do đó bạn có thể xử lý bất đồng bộ với async/await.

Ví dụ: Tải một content từ trang web tĩnh: fetch('https://iceteaviet.blogspot.com/hcmus.json')


Fetch cũng có thể thêm các tham số optional để customize HTTP request của bạn. Bạn có thể định rõ ra các header khi gửi POST request.

Bạn có thể tham khảo rõ hơn các ví dụ về Fetch API và các custom libraries khác tại đây hoặc đây.

i. Tích hợp React Native vào một ứng dụng có sẵn.

React Native rất tốt nếu bạn bắt đầu tạo ứng dụng với nó ngay từ đầu. Tuy nhiên đối với các project lớn nó cũng cực kì tốt khi thêm một vài SingleView hoặc user flow vào một dự án native có sẵn chỉ với một vài bước.

 - Hiểu rõ bạn cần intergrate component nào
 - Tạo một Podfile với subspec cho tất cả React Native components mà bạn muốn sử dụng trong native app
 - Tạo và chỉnh sửa các component đó bằng Javascript.
 - Thêm một event handler mới để tạo RCTRootView trỏ tới React Native component của bạn với tên AppRegistry mà bạn đã khai báo trong index.ios.js
 - Chạy React Native server bằng cách gõ lệnh npm start, và Run ứng dụng native của bạn từ XCode
 - Debug
 - Deploy ứng dụng của bạn qua script ‘react-native-xcode.sh’
 - Thưởng thức thành quả

Ngoài ra bạn cũng có thể làm ngược lại - intergrate một component tạo ra bằng native code (Swift, Java) vào ứng dụng React Native bằng cách sử dụng:

Import YourAwesomeComponent from ‘./com/icetea/native/component/yourawesomecomponent.js’

Bạn có thể tham khảo thêm tại đây hoặc bài blog sau.


Chúc các bạn học tốt và đừng quên để lại bình luận bên dưới nhé.




Chào các bạn! 
Tình cờ trong lúc lục lại đống assignment cũ năm 3, mình tìm thấy một bài report dài 30 pages do mình viết để seminar về React và React Native. Nhưng lúc đấy lại không đăng lên blog. Dù hơi cũ nhưng hôm nay mình xin giới thiệu cho các bạn biết sơ về nó nhé.

GIỚI THIỆU

React (React.js hay ReactJS) là một thư viện JavaScript mã nguồn mở để xây dựng giao diện, được tạo ra bởi Facebook vào tháng 3/2013. React hiện chỉ là thư viện chứ không phải framework, và ứng với phần V trong mô hình MVC.



React được Facebook đưa vào sử dụng thực tế cho dự án Facebook Ads của họ, và từ đó cả Instagram, Netflix hay Airbnb,.. cũng bắt đầu đưa React vào sử dụng cho các dự án của họ. Danh sách các dự án lớn sử dụng React có thể xem tại đây.

Hiện nay, thư viện này nhận được rất nhiều sự quan tâm đến từ cộng đồng, Github repo của React đang có được hơn 67k stars. Nó đang được maintain bởi Facebook và Instagram, cũng với sự đóng góp của cộng đồng 1011 (28/5/2017) lập trình viên giỏi trên Thế giới.




VẤN ĐỀ & GIẢI PHÁP


Từ xưa đến nay, việc xây dựng ứng dụng MVC phía client với data-binding 2 chiều thì cũng khá là đơn giản, tuy nhiên khi dự án phát triển, càng nhiều tính năng mới, càng nhiều người được bổ sung vào team dẫn tới quá trình phát triển bị chậm đi với code bases lớn và phức tạp, đồng thời hiệu năng cũng sẽ bị giảm đi.

Thời gian trôi qua, project đó sẽ trở thành ác mộng đối với những con người đang thực hiện nó. Source code trở nên quá “sâu” để lập trình viên có thể nhớ được. Khi thêm một chức năng mới sẽ rất vất vả và đòi hỏi testing khá nhiều.


Bạn cũng có thể giải quyết vấn đề đó bằng các thư viện khác như Backbone.js hay Angular.js tuy nhiên với các project qui mô càng to thì sẽ càng khó để quản lý.

React thì trái lại, nó sinh ra để dành cho những ứng dụng lớn dễ dàng quản lý khi mở rộng. React được tạo ra cho phần V của mô hình MVC, cho phép lập trình viên tạo ra các web app lớn, có thể hiển thị các dữ liệu thay đổi theo thời gian mà không cần reload lại trang, cũng như xây dựng các UI components có thể tương tác và tái sử dụng. Mục tiêu chính của React là nhanh, đơn giản, hiệu năng cao và dễ dàng mở rộng.


TẠI SAO LẠI LÀ REACT


React trở nên phổ biến như vậy là vì nó được tạo ra bởi Facebook?


Không! Dĩ nhiên là không.

Vậy tại sao React lại được nhiều ông lớn lựa chọn đưa vào dự án của mình mặc dù nó vẫn chưa thực sự trưởng thành?

● Giải quyết cho V trong mô hình MVC


● Giúp viết Javascript dễ dàng hơn với JSX


React sử dụng một cú pháp mới gọi là JSX, là một sự hòa trộn giữa Javascript và cú pháp XML: cho phép quoting như HTML và sử dụng HTML tag để render sub-components. Vì vậy nó cũng trở nên thân thiện hơn với các lập trình viên front-end.


● Component hóa giao diện

React Component API cho phép lập trình viên tạo ra các Component tương ứng với các phần của giao diện. Các component này có thể được tái sử dụng như một layout template, hoặc kết hợp với các component khác để xây dựng content của giao diện.



Việc này sẽ giải quyết được vấn đề ở mục (b), khi mà project trở nên càng lớn và phức tạp, nhờ đó tăng năng suất và chất lượng công việc của lập trình viên bởi vì thật dễ dàng khi bạn chỉ quản lý và sửa chữa các component của chính bạn. 

Vì các lý do đó component thực sự là tương lai của lập trình ứng dụng Web, và đây cũng là tính năng quan trọng nhất, là Top-Level API mà bộ lõi React đem lại.

● Tăng hiệu năng với Virtual DOM:


React sử dụng khái niệm virtual DOM để tạo lại các component của bạn ngay cả khi component đó đang “live”. Cách tiếp cận này mang lại cho bạn tính linh hoạt rất lớn và cải thiện hiệu năng bởi React có thể tính toán được trước những thay đổi nào cần thực hiện trong DOM và chỉ update DOM theo những thay đổi đó.


Bằng cách đó React tránh và giảm thiểu những hành động gây tốn tài nguyên của DOM và làm cho việc cập nhật giao diện hiệu quả hơn.

● Thân thiệt với SEO:


Một trong những vấn đề lớn của các Js frameworks là nó không thân thiện với các cỗ máy tìm kiếm (search engine). Mặc dù đã có nhiều cải thiện nhưng thực sự search engine vẫn gặp rất nhiều khó khăn khi “đọc” các web app chứa nhiều Js


Tuy nhiên React tự hào nằm ngoài số đó bởi vì bạn có thể chạy React trên server và các virtual DOM của component sẽ được render và trả về trình duyệt dưới dạng web page mà không cần các thư viện bên thứ 3 hay bất kì thủ thuật nào. Vì vậy React đáp ứng đầy đủ tính SEO friendly

● React cung cấp nhiều công cụ out-of-the-box


Khi bạn bắt đầu những chuyến phiêu lưu với React, đừng quên cài đặt extension chính thức của React Chrome, nó giúp debug app nhanh hơn. React cũng giúp chúng ta update các Views với Flux – mô hình kiến trúc để thiết kế UI do Facebook đề xuất nhằm kiếm soát workflow của chương trình.

● Dễ dàng viết UI Testcases.


● React Native



React Native được Facebook công bố 2 năm sau React, cung cấp kiến trúc React để phát triển các ứng dụng native (iOS, Android UWP) và hứa hẹn sẽ tiếp nối React thành một kẻ khổng lồ trong lĩnh vực lập trình ứng dụng mobile

● Những bộ não lớn đang “hậu thuẫn” đằng sau React


React được Facebook opensource và hiện được phát triển bởi rất nhiều lập trình viên giỏi trên thế giới, vì vậy tương lai của React cũng cực kì được đảm bảo.

● Dễ dàng chuyển đổi trong công việc: 

Khi thuần thục React, bạn sẽ tận dụng được cốt lõi của nó để dễ dàng chuyển đổi giữa ReactJs và React Native để làm việc trên cả 2 khía cạnh đang “hot” trong giới IT hiện nay là lập trình web và lập trình mobile.

Đến đây là kết thúc phần 1 về Reactjs rồi. Mời các bạn đón xem phần 2 - React Native ở bài tiếp theo và đừng quên để lại bình luận bên dưới nhé. 
Chúc các bạn học tốt!



Chào các bạn! Đã gần 4 tháng không gặp nhỉ :D.

Thời gian gần đây mình rất hay nhận được câu hỏi từ các bạn sinh viên năm 1,2 kiểu như:
  • "em code cũng khá được nhưng thường phải search Google tham khảo code không biết có quá tệ không?"
  • "em luôn lên Stack Overflow để tìm giải pháp cho vấn đề gặp phải, thậm chí những hàm cơ bản của ngôn ngữ em cũng hay quên và phải Google để tìm, vậy có phải em sẽ trở thành một developer tệ không?"
Anh cũng vậy đó em =))

Mình cũng không hiểu tại sao lại có những câu hỏi ngớ ngẩn thế này, nhưng theo mình câu trả lời còn tùy thuộc vào lĩnh vực mà bạn đang học. Software Engineering, Computer Science, Networking hay Database,..
Các lĩnh vực như C.S. đòi hỏi bạn phải có một tư duy tốt, động não suy nghĩ trước khi sử dụng last resort là search Google giải pháp cho vấn đề đó.

Ở đây mình sẽ nói đến lĩnh vực S.E - tập trung nhiều hơn về productivity và chất lượng của project - cũng là lĩnh vực mình đang theo học nên mới dám chém gió =)).

Câu trả lời là: KHÔNG. Dĩ nhiên là không.


Không developer/programmer nào có thể tự vỗ ngực tuyên bố rằng họ có thể hoàn thành một project mà không phải google một vài lần.

Ví dụ đối với các web developers, ngoài kia có hàng trăm HTML tags, cả đống thuộc tính của CSS, rồi Javascript lại là một ngôn ngữ không "strict" làm mọi thứ rối tung lên thì làm sao bạn có thể dễ dàng nhớ hết tất cả mọi hàm, mọi tag, mọi thuộc tính của chúng được chứ? 
Sẽ có những lúc ta cần quyền trợ giúp, và trong 80% trường hợp thì luôn có một người nào đó trên Trái Đất này từng gặp phải vấn đề tương tự và đã giải quyết được nó. Nếu họ là người sống vì cộng đồng dĩ nhiên họ sẽ post lên Internet và mong rằng có thể sẽ giúp được ai đó tiếp tục tập trung vào công việc mà không lãng phí thời gian vô ích.

Việc này làm mình nhớ tới một câu chuyện về Albert Einstein như này: 
Trong một buổi tiệc tối Einstein được hỏi xin số điện thoại của ông, và ông mở phone book ra để tìm nó, người kia bèn hỏi tiếp tại sao ông lại cần phone book để ghi lại cả số của mình trong khi ông là người rất rất thông minh và có trí nhớ siêu đẳng như vậy. Einstein trả lời rằng: "Tại sao tôi cần phải làm não mình trở nên lộn xộn để nhớ những thông tin mà tôi có thể dễ dàng tìm thấy khi tôi cần nó?"

Stack Overflow (SO) - trang hỏi đáp mà bạn hay thấy mỗi lần search vấn đề gì đó trên Google - thực sự là best steroids dành cho các developer. Mình nghiêm túc đấy!
SO hoạt động theo dạng example based - giải quyết vấn đề qua các đoạn code ví dụ - đó là một cách cực kì mạnh mẽ để học một thứ gì đó. Ngay cả khi copy/paste những đoạn code đó không giải quyết được vấn đề của bạn, nó cũng sẽ giảm thiểu thời gian bạn bỏ ra để cho việc hiểu một vấn đề gì đó bằng những đoạn code nhỏ, hơn là phải loay hoay trong đống code dài vô tận của hầu hết các documents hiện nay
Chắc ai cũng muốn có một quyển ^^

Muốn biết cách để thực hiện việc X với Y,Z? Chỉ cần search và đây là cách mà Y, Z nó hoạt động, đây là các tham số đầu vào, đây là những dữ liệu cần thiết.
Gặp phải vấn đề B? Chỉ cần search và...đây...thì ra là do C. Bây giờ đơn giản chỉ việc suy nghĩ làm sao để giải quyết C thôi. Hmmm hay lại lên search làm sao để giải quyết C nhỉ? :D

Mặt khác, việc search Google tham khảo code hay giải pháp của người khác còn giúp bạn viết những đoạn code tốt hơn, tránh việc sử dụng các giải pháp tạm thời (work around) mà không hiểu rõ và giải quyết triệt để vấn đề (dễ thấy ở việc các developers hay lạm dụng try/catch hoặc check null vô tội vạ mà không cần biết vấn đề tại sao Exception đó bị thrown). 
Hay tốn cả tấn thời gian vào việc đọc đống documents cùng với những đoạn code ví dụ dài loằng ngoằng trong đó và dẫn đến việc không bắt kịp deadlines.
How to không trễ deadline???

Là một sinh viên ngành S.E, là một developer, mình thường dành thời gian và chất xám vào việc hiểu cách thức mà hệ thống vận hành và làm sao để giải quyết các vấn đề. Tập trung vào bức tranh toàn cảnh sẽ tốt cho công việc của bạn hơn là cố gắng ghi nhớ rõ từng cú pháp như to_upper(), upper(), hay là toUpper(). Với những vấn đề như vậy khi mắc phải mình có thể search và ôn lại gần như ngay lập tức.

Bởi vì không có lý do nào để reinventing the wheel khi nó đã được người trước giải quyết và áp dụng thành công.

Một số bạn sẽ hỏi rằng: Vậy khi gặp những vấn đề khó hơn và phức tạp hơn thì làm cách nào mà áp dụng search Google vào giải quyết được?
Đối với những vấn đề phức tạp - chúng ta...vẫn áp dụng nguyên tắc trên. Tại sao chúng ta phải dành nhiều thời gian và nỗ lực để giải quyết vấn đề mà có một người nào đó đã giải quyết rồi ?? :D ??. 
Bạn không cần phải tìm hiểu làm cách nào để tạo ra một transmission nếu bạn đang muốn tạo ra một chiếc xe hơi. Vấn đề quan trọng là dành thời gian đó để hiểu được giải pháp mà bạn vừa implement và dành thời gian đó để giải quyết các vấn đề độc nhất mà chỉ mình project bạn gặp phải.

Nói đi cũng phải nói lại.


Bạn cũng không nên lạm dụng việc search Google mà đi copy/paste bất cứ thứ gì bạn tìm thấy, ít nhất thì cũng phải hiểu "sơ sơ" về các đoạn code đó trước khi implement vào project của bạn.
Điều tốt nhất bạn có thể làm là luôn hiểu rõ tại sao vấn đề được giải quyết với giải pháp đó. Cứ như vậy bạn sẽ học được những cái mới một cách nhanh nhất và những vấn đề đó sẽ không phiền bạn trong tương lai nữa. Việc học là việc tìm hiểu, nhưng nếu bạn cứ bỏ qua phần "hiểu" mà chỉ chăm chăm vào việc "tìm" sau đó copy/paste code thì đó chính là thất bại của bạn.

Link sách ở trên: https://www.gitbook.com/book/tra38/essential-copying-and-pasting-from-stack-overflow/details

Chúc các bạn học tốt! Happy coding!


Contact Form

Name

Email *

Message *

Powered by Blogger.
Javascript DisablePlease Enable Javascript To See All Widget