Bài viết được sự cho phép của BBT Tạp chí Lập trình
Giới thiệu chung
ReactJS là một thư viện JavaScript dùng trong việc xây dựng giao diện người dùng và được phát triển bởi đội ngũ Facebook. Tới nay, ReactJS đã thu hút hàng triệu lập trình viên trên thế giới.
React được sử dụng để xử lý ở tầng view cho các website và mobile app, cho phép ta tạo nên các Reusable UI components. React là 1 trong những thư viện JS phổ biến nhất hiện nay, có nền tảng vững chắc cùng với 1 cộng đồng developer vô cùng lớn đằng sau nó. Bạn sẽ không hối hận khi học nó đâu.
Không dài dòng nữa, chúng ta bắt đầu thôi!
1/ Thiết lập môi trường
Cài đặt NodeJS phiên bản mới >= 6 (LTS hoặc bản hiện tại – https://nodejs.org/en/download/)
Cài đặt Visual Studio Code/Sublime Text hoặc WebStorm (tùy chọn)
2/ Cài đặt
Chúng ta sẽ tiến hành cài đặt ReactJS thông qua Package đã được viết sẵn bằng cách gõ vào lệnh vào Command Prompt/Windows Powershell hay Terminal trên Mac và Linux:
npm install -g create-react-app
Sau khi cài đặt hoàn tất, các bạn có thể gõ tiếp lệnh theo cú pháp sau:
create-react-app my-app
Đây là kết quả sau khi cài đặt thành công:
Đây là kết quả hiển thị
Bây giờ chúng ta có thể chạy thử:
cd my-app yarn start
Như vậy là chúng ta đã hoàn tất cách cài đặt ReactJS. Chuyển sang tinh chỉnh một số File nào. Bạn hãy vào trong thư mục src và tìm file App.js như hình:
File app.js
Chúng ta sửa lại nội dung trong file App.js:
import React from 'react';
import logo from './logo.svg';
import './App.css';
function App() {
return (
<div>
Hello World!!!
</div>
);
}
export default App;
Ngay lập tức sẽ hiển thị kết quả như sau:
Kết quả hiển thị
Trong index.js chũng ta thấy đoạn code, ở đây được dùng load file App.js khi khởi tạo chương trình.
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import * as serviceWorker from './serviceWorker';
ReactDOM.render(
<React.StrictMode>
<App />
</React.StrictMode>,
document.getElementById('root')
);
Bạn thắc mắc không biết Id root ở đâu? Bạn để ý trong project mình có 1 thư mục là public, bạn mở nó ra thấy 1 file index.html mở nó ra và bạn sẽ thấy 1 div với id root như hình:
Đây là file HTML chính của chúng ta, tất cả component sẽ được load ở đây.
Lời kết
Như vậy, chúng ta đã tìm hiểu ReactJS và cách cài đặt như thế nào, tự viết hiển thị Helloworld đầu tiên bằng ReactJS.
Bài viết được sự cho phép của tác giả Kien Dang Chung
Trong thế giới mã nguồn mở, việc quản lý các gói phần mềm trong một dự án là rất cần thiết do các gói phần mềm dự án, các gói liên quan đến gói được cài đặt có thể thay đổi hoặc bạn cần cập nhật một phiên bản phù hợp. Công việc này nếu không có các công cụ quản lý gói phần mềm (package manager) thì rất đáng sợ do bạn thường xuyên phải vào nơi cung cấp các gói phần mềm kiểm tra xem có phiên bản mới không, tải về và cập nhật chúng vào dự án. Một dự án có thể sử dụng đến hàng trăm các gói phần mềm nguồn mở này, vậy quản lý chúng như thế nào? Đừng lo đã có các công cụ như yarn, npm…
Công cụ Quản lý gói phần mềm – câu trả lời cho Yarn là cái gì?
Yarn là công cụ quản lý gói phần mềm nguồn mở cho dự án của bạn, nó ngoài việc cho bạn sử dụng các gói phần mềm còn cho phép bạn chia sẻ các gói phần mềm do bạn viết với các lập trình viên trên toàn cầu. Yarn thực hiện các công việc với tốc độ rất nhanh, bảo mật cao và đáng tin cậy. Code được chia sẻ thường được gọi là package (gói phần mềm) hoặc module (mô đun phần mềm). Tất cả các gói được sử dụng sẽ được mô tả trong file package.json nằm trong thư mục gốc của dự án. Như vậy chúng ta đã có được câu trả lời Yarn là gì?
Cài đặt Yarn
Môi trường Windows
Có ba lựa chọn cài đặt trên Windows:
Cài đặt thông qua bộ cài
Tải bộ cài Yarn và thực hiện cài đặt, đây là một file thực thi trên Windows có phần mở rộng là .msi. Tuy nhiên, trước hết bạn cần cài đặt Node.js.
Cài đặt thông qua npm
Nếu bạn đã cài đặt npm và muốn chuyển sang yarn thì đơn giản hơn hết là bạn cài đặt yarn thông qua npm như sau:
npm install yarn --global
Cài đặt thông qua các package manager cho Windows như Scoop, Chocolatey
Trước tiên cần cài đặt Scoop hoặc Chocolatey là các công cụ quản lý gói phần mềm trên Windows. Sau đó thực hiện cài đặt Yarn:
Cài đặt thông qua Homebrew là một package manager:
brew install yarn
Nó tự động cài đặt Node nếu máy bạn chưa cài.
Yarn và npm dùng cái nào?
npm là công cụ quản lý gói phần mềm mặc định cho Node.js còn Yarn là giải pháp quản lý gói phần mềm được Facebook phát triển riêng. Tiếp theo, chúng ta cùng so sánh một số tính năng khác biệt giữa yarn và npm giúp bạn có được sự lựa chọn tốt nhất.
File yarn.lock
Trong file package.json cả npm và yarn đều dựa vào file cấu hình này thực hiện theo vết các gói phụ thuộc trong dự án, phiên bản các gói không phải lúc nào cũng chính xác. Thay vào đó, thường xác định một khoảng các phiên bản cho phép, bằng cách này cho phép chọn một phiên bản cụ thể nhưng khi cài đặt npm thường chọn phiên bản mới nhất để khắc phục các lỗi phiên bản trước đó. Về lý thuyết, các phiên bản mới sẽ không phá vỡ các kiến trúc trong phiên bản cũ, nhưng thực tế không phải lúc nào cũng vậy. Sử dụng npm để quản lý gói phần mềm có thể dẫn đến trường hợp hai máy có cùng một file cấu hình package.json nhưng lại có các phiên bản của các gói khác nhau và nảy sinh các lỗi “bug on my machine”. Để tránh việc phiên bản không trùng khớp, một phiên bản chính xác sẽ được đưa vào trong file lock để quản lý. Mỗi khi một module được thêm vào, yarn sẽ tạo ra (nếu chưa có) hoặc cập nhật file lock. Bằngản cách này, yarn đảm bảo các máy khác nhau sẽ có cùng phiên bản chính xác trong khi vẫn có một loạt các phiên bản cho phép được định nghĩa trong file package.json. Ý tưởng này cũng giống như composer.lock được sử dụng trong Composer, công cụ quản lý gói phần mềm cho PHP. Với npm, lệnh npm shrinkwrap cũng tạo ra một tập tin lock và npm install sẽ đọc tập tin lock này trước khi đọc đến package.json, nó giống với cách yarn thực hiện bằng yarn.lock. Sự khác biệt ở đây là yarn luôn luôn tạo ra và cập nhật yarn.lock trong khi npm chỉ làm việc này khi thực hiện npm shrinkwrap hoặc tồn tại file npm-shrinkwrap.json.
Yarn cài đặt các gói song song
Khi npm và yarn cài đặt một gói phần mềm, có rất nhiều các tác vụ cần thực hiện, với npm các tác vụ này được thực hiện tuần tự, điều đó có nghĩa là npm sẽ đợi cho gói này được cài đặt xong đầy đủ mới tiếp tục cài đặt các gói khác. Yarn thì khác, nó xử lý các tác vụ song song, giúp tăng hiệu năng quá trình hoạt động. Để kiểm tra, tôi thực hiện cài đặt gói express sử dụng cả npm và yarn mà không sử dụng shrinkwrap hoặc yarn.lock và không có cache dữ liệu. Với yarn việc cài đặt mất 5.34s, còn npm hết 14s. Đây chỉ là một thử nghiệm với một gói, nếu dự án của bạn có hàng trăm gói, thực sự có một sự khác biệt lớn về thời gian cài đặt. ### Hiển thị thông tin cài đặt
Khi thực hiện cài đặt các gói bằng yarn, màn hình hiển thị các thông tin một cách rút gọn, các thông tin chi tiết về gói cài đặt có thể thực hiện thông qua lệnh khác. Trong khi đó npm đệ quy qua các phụ thuộc và in ra màn hình thông tin quá nhiều.
Màn hình hiển thị các thông tin một cách rút gọn
Yarn – npm bạn chọn cái nào?
Một thực tế trong quá trình phát triển ứng dụng của Facebook, npm đã đáp ứng rất tốt trong giai đoạn đầu, nhưng khi codebase và số lập trình viên phình ra nhanh chóng, xuất hiện những vấn đề về sự nhất quán, bảo mật và hiệu năng. Để giải quyết các vấn đề này, Facebook đã tự xây dựng một giải pháp cho riêng mình, và yarn ra đời. Với Yarn, các lập trình viên vẫn có thể truy xuất vào danh sách các gói được đăng ký cho npm. Thực tế sử dụng cho thấy, Yarn có rất nhiều ưu điểm, tuy nhiên cũng có những nhược điểm như do là lính mới trong lĩnh vực package manager nên Yarn còn tồn tại khá nhiều lỗi, nhưng cũng không có gì đáng lo khi cộng đồng sử dụng Yarn đang lớn dần, mọi lỗi gặp phải bạn có thể tìm kiếm trên Google hoặc vào phần Issue cùa Yarn trên Github, có rất nhiều các issue được đưa ra. Yarn tuy là một đứa trẻ trong lĩnh vực quản lý thư viện lập trình, nhưng nó đã nhanh chóng sửa đổi những gì thiếu sót từ những đàn anh đi trước, và một ngày không xa, yarn thực sự sẽ thay thế dần cho npm.
Bài viết được sự cho phép của tác giả Nguyễn Việt Hưng
Giao diện đồ hoạ (GUI – Graphic User Interface) vốn từng là một phần không thể thiếu khi nói về lập trình. Dù học ngôn ngữ lập trình nào, người ta cũng nghĩ tới chuyện “làm sao để có giao diện đồ hoạ”.
Thế giới thay đổi, thứ từng quan trọng của ngày hôm qua thì hôm nay chưa chắc đã cần tới. Thời đại tất cả mọi thứ đều chuyển lên web, thì web/app mobile trở thành giao diện để tương tác với người dùng, chứ không phải các phần mềm có giao diện chạy trên máy tính như trước kia. Giờ đây người ta: nghe nhạc trên web, xem film trên web, chơi game trên web, soạn thảo văn bản trên web… khó còn ứng dụng nào không đưa lên web nữa. Vậy nên về mặt “sự nghiệp”, có vẻ như bạn nên đầu tư vào kỹ năng làm web thay vì học để tạo một app trên desktop như cách đây chục năm.
Dĩ nhiên, GUI không ngay lập tức biến mất, vẫn có nhu cầu sử dụng, vẫn có người dùng, vẫn có hàng tá thư viện đồ hoạ tồn tại từ lâu (và vẫn tiếp tục phát triển), vẫn có những game mà chỉ chơi được trên máy tính do yêu cầu về hiệu năng mà web không đáp ứng nổi (như Half-Life/ đế chế / đua xe …).
Python hỗ trợ không ít các thư viện làm GUI app, có thể kể tới: Qt, WxWidgets, Tkinter, Kivy (làm cả app mobile)… xem đầy đủ tại:
Qt là nền tảng phát triển ứng dụng dùng trong công nghiệp, hỗ trợ mọi hệ điều hành phổ biến, và rất “xịn”. Nếu có nhu cầu làm ứng dụng desktop với Python, hãy đầu tư vào Qt để có một sản phẩm đẳng cấp, không kém bất kỳ nền tảng nào khác.
Tk là hệ thống thư viện đồ hoạ đơn giản, dễ dùng, chạy trên cả 3 hệ điều hành phổ biến: Windows, Ubuntu, OSX/MacOS và điều quan trọng nhất: thư viện tkinter đi kèm mọi bộ cài Python, nên muốn dùng không cần phải cài đặt gì thêm.
Bài viết hướng dẫn tạo một chương trình đồ hoạ sử dụng tkinter với Python 3.6, thực hiện trên MacOS Sierra (10.12.6).
Khái niệm cơ bản về một chương trình giao diện đồ hoạ.
Một chương trình có giao diện đồ hoạ là một chương trình luôn chạy cho tới khi người dùng thoát chương trình. Dễ suy ra ở đây có chạy 1 vòng lặp vô hạn để luôn hiển thị giao diện (gọi là main loop). Chương trình này hoạt động dựa trên những tương tác của người dùng và phản ứng với các tương tác đó (bấm nút này thì chạy cái kia). Loại chương trình như vậy thuộc loại mô hình “Event-driven programming”.
Các thao tác của người dùng được gọi là các event, các hành động tương ứng của chương trình (các function) được gọi là các callback, gắn vào các bộ phận giao diện. Gắn callback vào nút bấm thì khi ta bấm nút, callback sẽ được gọi.
Các bộ phận giao diện như nút bấm, chữ, ô nhập ký tự … được gọi là các widget.
Nếu Tk hoat động trên máy bạn, ngay lập tức một cửa sổ trắng tinh sẽ hiện ra.
Cửa sổ hiển thị
Tk() tạo một cửa sổ chính (main window), Frame là một widget có khả năng chứa các widget khác. Gọi function mainloop() để chạy giao diện mãi mãi cho tới khi người dùng đóng lại.
Sau đây ta viết một GUI app có hiển thị tiêu đề (Label), có một ô nhập địa chỉ trang web (Entry), có một nút bấm để kiểm tra status của trang web (Button).
Bài viết sử dụng thư viện requests (cài bằng pip install requests), nếu chưa biết dùng pip hay không cài được, hãy xem ví dụ tương tự mà không kết nối internet tại đây.
# on Ubuntu, requires install: `sudo apt-get install -y python3-tk`importtkinterastkimportrequestsclassApplication(tk.Frame):def__init__(self,master=None):super().__init__(master)self.pack()self.create_widgets()defcreate_widgets(self):self.label=tk.Label(text="PyMi.vn checker")self.label.pack()self.entrythingy=tk.Entry()self.entrythingy.pack()self.contents=tk.StringVar()self.entrythingy["textvariable"]=self.contentsself.entrythingy.bind("<Key-Return>",self.check_site)self.hi_there=tk.Button(self)self.hi_there["text"]="Check web site up/down. Enter URL:"self.hi_there["command"]=self.check_siteself.hi_there.pack()self.quit=tk.Button(self,text="QUIT",command=root.destroy)self.quit.pack()defcheck_site(self,event=None):url=self.contents.get().strip()or"https://pymi.vn"ifnoturl.startswith("http"):url="http://{}".format(url)resp=requests.head(url,timeout=3)print("{} response: {}".format(url,resp.status_code))root=tk.Tk()app=Application(master=root)app.master.title("My checker app")app.master.minsize(300,200)app.mainloop()
Code trên:
phần init chỉ là thủ tục
tạo một label với text cần hiển thị
tạo entry để người dùng nhập nội dung, gán giá trị người dùng nhập vào self.contents, bind widget entry với phím Enter (trên MacOS gọi là return), và chạy method check_site khi người dùng gõ enter.
tạo nút bấm với dòng chữ “Check site”, gọi method check_site khi người dùng bấm nút
tạo nút bấm “Quit” để thoát chương trình
set thanh tiêu đề title và kích thước cho chương trình qua app.master.
Tk nhẹ gọn, có sẵn, dễ dùng, đủ dùng khi bạn thấy đủ. Bao giờ thấy ngột ngạt, có lẽ lại chuyển sang Qt, các khái niệm lập trình giao diện dù dùng library/framework nào cũng đều tương tự nhau.
Lập trình viên hay sử dụng một số app và phần mềm để tham khảo và tạo nên app của mình – sử dụng app để build 1 app khác. Khi làm việc, các dev cần đảm bảo được UI UX của phần mềm ở mức tối ưu nhất để tăng sự tương tác và người dùng sẽ cảm thấy hứng thú hơn khi trải nghiệm app hay web vừa được tạo.
Tuy nhiên chỉ vì có một số app đã trở thành chuẩn mực và được nhiều người sử dụng mà chúng ta hay bỏ qua các phần mềm hay ho khác. Dưới đây tôi sẽ giới thiệu với các bạn một số app dù bị đánh giá thấp nhưng lại rất hữu ích mà tôi thường sử dụng và tôi nghĩ các bạn cũng nên tham khảo, bổ sung thêm vào kho lưu trữ của mình.
Tôi biết đến app này trong giai đoạn COVID-19 và phải work from home. Lúc đó vấn đề của tôi là làm thế nào để truy cập vào một máy tính hoặc máy chủ tại nơi làm việc của mình dù đang ở nhà? Sử dụng lệnh ssh vào máy chủ, bạn có thể cấp quyền truy cập vào các thiết bị đầu cuối cho mình. Nhưng với Termius bạn sẽ tiết kiệm được rất nhiều thời gian cho việc này.
Termius là một máy khách SSH cho giao diện của Windows, macOS, Linux, iOS và Android. Nó còn là một giải pháp dòng lệnh hoàn chỉnh xác định lại quyền truy cập từ xa cho các sysadins và các dev. Ứng dụng này hỗ trợ nhiều chủ đề, phông chữ, kích thước mà bạn có thể điều chỉnh để tạo nên UI UX ấn tượng cho sản phẩm, phù hợp với nhu cầu người dùng.
Một trong những tính năng đặc trưng nhất của Termius là tính năng port forwarding – chuyển tiếp cổng mà tôi thường sử dụng cho Jupyter. Ngoài ra, Termius cũng hỗ trợ đồng bộ hóa các dữ liệu trên thiết bị di động thông qua tài khoản miễn phí hoặc trả phí với nhiều tiện ích hơn.
Alacritty là app mô phỏng cục bộ các thiết bị đầu cuối mà tôi hay sử dụng, nó được hỗ trợ trên Windows, macOS và nhiều linux khác. Điểm hay nhất của Alacritty là giúp tăng tốc GPU, do đó mà user đều rất ấn tượng với tốc độ thực hiện của nó.
Alacritty là app mô phỏng cục bộ các thiết bị đầu cuối
Alacritty dù đơn giản hơn nhiều so với Termius nhưng vẫn đầy đủ các tùy chỉnh. Nó chấp nhận các tệp ở dạng .yml và cho phép bạn lựa chọn cách thiết kế từ phối màu, liên kết bàn phím đến làm mờ nền,… Chính sự tiện ích này của Alacritty sẽ giúp sản phẩm sau khi hoàn thành có giao diện người dùng thu hút hơn, những lợi ích của UI UXthậm chí có thể quyết định sự thành bại của project mà bạn đang thực hiện.
Về mặt kỹ thuật thì đây không hẳn là một app hay một phần mềm nhưng với rất nhiều tiện ích mà nó mang lại, tôi thường xuyên sử dụng Byobu trong công việc của mình. Byobu là một trình bao bọc dễ sử dụng xung quanh tmux (hoặc là screen), GNU – những nền tảng ghép kênh mà bạn có thể đã nghe đến. Nó giúp bạn dễ dàng mở nhiều cửa sổ và chạy nhiều lệnh trong một kết nối đầu cuối duy nhất.
Một sự thật thú vị là Byobu đang được vận hành bởi Alacritty. Vậy nên sẽ khá dễ dàng để tạo một giao diện UI UX và chuyển đổi giữa 2 app này. Các tính năng chính của Byobu gồm nhiều cửa sổ giao diện điều khiển, các ô tách trong mỗi cửa sổ, thông báo và huy hiệu trạng thái để hiển thị trạng thái của máy chủ và các phiên liên tục trên nhiều kết nối. Byobu sử dụng các phím chức năng F1, F2, F3,… là chủ yếu và rất linh hoạt trong quá trình làm việc.
4. Ungit
Mọi người đều biết rằng rất khó để quản lý kho lưu trữ Git thông qua giao diện dòng lệnh. Với một project trên 20 branch sẽ rất khó để theo kịp các commit của chúng, đó là chưa tính đến branching model. Thậm chí với các dev lần đầu sử dụng Git để quản lý version, một CLI còn khiến user không thể hiểu được Git thực sự làm được gì. Nhưng Ungit giải quyết được những điều đó.
Ungit có một giao diện thân thiện với user mà không làm mất đi tính linh hoạt của nó. Ungit cho phép user sử dụng thông tin các commit và branch ở dạng sơ đồ mạng nhện. Giao diện rõ ràng và trực quan của nó giúp git dễ hiểu hơn cũng như việc kiểm tra chéo giữa các branch sẽ đơn giản hơn. Lợi ích của UI UX từ Ungit cũng cho phép user xem được lịch sử các branch đang truy cập và hỗ trợ hợp nhất các branch, các tag khác nữa.
Spacedesk về cơ bản là ứng dụng mở rộng không gian làm việc cho máy tính, biến thiết bị di động của bạn thành màn hình hiển thị thứ hai của máy tính, ipad. Rõ ràng ứng dụng này có thể giúp bạn tiết kiệm được nhiều chi phí và thời gian hơn thay vì mua thêm một màn hình nữa.
Cá nhân tôi đã từng sử dụng app Spacedesk cho chiếc laptop cũ của mình và chúng hoạt động khá trơn tru và ít xảy ra lỗi. Vì Spacedesk là ứng dụng hỗ trợ kết nối không dây nên tất cả những gì bạn cần chuẩn bị là kết nối internet đủ tốt mà thôi.
Kết luận
Trên đây là một số chia sẻ về những ứng dụng dù bị đánh giá thấp nhưng lại sở hữu nhiều tính năng ấn tượng mà bạn nên sử dụng để build được những phần mềm có giao diện dễ sử dụng và thuận tiện cho người dùng. Để tìm hiểu thêm về UI UX là gì, tầm ảnh hưởng của nó với các sản phẩm mà dev tạo nên, bạn có thể xem tại bài viết Series UI/UX cho developer – Phân biệt UI và UX
Nhiều người cho rằng ứng tuyển ngành lập trình không cần quá chú trọng về CV. Tuy nhiên, nhận định định đó là sai lầm. Bởi mỗi vị trí đều đòi hỏi các trình độ – kỹ năng khác nhau. Do đó, một chiếc CV IT Programmer cần đảm bảo đầy đủ tính chuẩn mực cần có. Vậy bạn đã biết cách tạo CV xin việc cho mình chưa? Bài viết sau, TopDev sẽ bật mí cho bạn mẫu IT Programmer CV ấn tượng nhất để chính phục nhà tuyển dụng.
Mẫu trình bày cơ bản – IT Programmer CV
Tên của bạn (và các thông tin cá nhân)
Ví dụ: Raina Angela Barbie
raina.anbie@gmail.com | 111-xxx-xxx| Texas, NY
Mục tiêu nghề nghiệp
Đây là mục khá quan trọng đối với CV ngành IT của bạn. Nhà tuyển dụng sẽ đánh giá mức độ hoạch định mục tiêu phát triển của bạn.
Ví dụ: Học hỏi và nâng cao trình độ chuyên môn về lập trình JavaScript, C++. Mong muốn trở thành chuyên gia nghiên cứu các giải pháp phát triển; hỗ trợ và đào tạo các lập trình viên trẻ tuổi.
Kỹ năng
Một số kỹ năng bạn mà IT Programmer CV của bạn có thể cân nhắc lựa chọn là:
Tư duy định hướng, làm việc nhóm
Đa nhiệm, sáng tạo
Phân tích và giải quyết vấn đề
Kỹ năng giao tiếp nâng cao (đồng nghiệp, đối tác,…)
Khả năng thích ứng và chịu áp lực
Kỹ năng chuyên sâu
Vị trí này đòi hỏi bạn cần có nhiều kinh nghiệm hơn. Vì thế, quá trình tạo CV IT tiếng anh hoặc tiếng việt cũng chính là cơ hội bạn đánh giá lại các kỹ năng của mình.
Ứng viên IT cần quan tâm nhiều hơn đến các kỹ năng chuyên sâu
Dưới đây là các kỹ năng chuyên sâu mà cần có cho vị trí IT Programmer:
– Hệ thống máy tính: Mac OS X, DOS, Window,…
– Các ngôn ngữ lập trình: React JS, C++, HTML, Python, SharePoint,…
– Cơ sở dữ liệu: MS Access, Oracle 9.x, FileMaker Pro, FoxPro, MySQL
Trình độ học vấn
Do là vị trí đòi hỏi nhiều kinh nghiệm, ngoài việc trình bày nơi học tập (tốt nghiệp Cử nhân…., điểm GPA (nếu muốn đề cập), bạn có thể chia ra các phần như:
+ Coding cơ bản và nâng cao (Coding Basics, Advanced)
+ Quản lý dự án (IT Project Management)
+ An ninh Mạng (Cyber Security)
+ Quản lý bảo trì thiết bị (CMMS)
+ Xử lý sự cố (Troubleshooting)
Và các khóa học khác…
Dự án cộng đồng
Bạn nên trình bày các dự án có gắn liền với việc sử dụng chuyên một hay nhiều cơ sở dữ liệu hoặc các chuyên môn có liên quan.
Ví dụ sử dụng FileMaker Pro để thiết kế các đơn nộp trực tuyến,…
Giải thưởng danh dự
Nói về các giải thưởng bạn/Team bạn đạt được nếu có.
Kinh nghiệm
Phần này tùy thuộc vào “tuổi nghề” mà bạn sở hữu. Hãy thông minh trong việc trình bày các kinh nghiệm có trong CV IT của mình. Nếu bạn là một freelancer IT, đừng ngần ngại chia sẻ trải nghiệm của mình vào CV IT nhé! đơn xin nghỉ việc, kỹ năng giao tiếp
Gợi ý cho bạn là có thể chia sẻ các trải nghiệm theo từng giai đoạn:
– Thực tập sinh – Programmer Intern
– Giai đoạn trình độ được nâng cao và phát triển (có thể chạm đến mức độ là IT Specialist – Chuyên viên)
– Giai đoạn hợp tác và đại diện cho các khách hàng/đối tác lớn (nếu có)
Hiện nay, một ứng dụng phổ biến, được nhiều người sử dụng không chỉ là một ứng dụng phục vụ tốt nhu cầu trong nước, mà còn phải hỗ trợ nhiều ngôn ngữ khác để có thể chạm tới những đối tượng người dùng ngoại quốc. Hoặc ít nhất thì cũng phải hỗ trợ tiếng Anh, ngôn ngữ phổ biến nhất trên thế giới hiện nay, và đương nhiên là phải có tiếng Việt (mình người Việt mà ^^).
Vậy ít nhất ứng dụng của bạn phải hỗ trợ hai ngôn ngữ chính là tiếng Việt và tiếng Anh. Trong bài viết này, mình sẽ hướng dẫn mọi người cách hỗ trợ đa ngôn ngữ trong Flutter. Hãy cùng bắt đầu nào!
Tạo project và sửa file pubspec.yaml
Đầu tiên, hãy tạo một project flutter. Mình sẽ tạo project có tên là flutter_localization, bạn đặt tên gì cũng được, không nhất thiết phải đặt theo mình. Sau khi tạo xong, các bạn tạo một folder mới trong project, đặt tên là lang (hoặc languages, mình sẽ dùng lang cho nó ngắn). Trong thư mục lang, bạn tạo cho mình 2 file json là vi.json và en.json, hai file này chính là hai ngôn ngữ tiếng Anh (en.json) và tiếng Việt (vi.json) cho ứng dụng của chúng ta.
Các file .json này thường được đặt tên theo quy tắc <mã_ngôn_ngữ>.json, trong đó chứa ngôn ngữ đó. Ví dụ trong file vi.json mình sẽ có:
{"hello":"Xin chào!","welcome":"Chào mừng bạn đến với Flutter"}
Đồng thời mình sẽ có file en.json:
{"hello":"Hello!","welcome":"Welcome to Flutter"}
Dành cho bạn nào chưa biết thì cấu trúc của file json là một cái key nằm trong cặp ngoặc kép (“”) sau đó là dấu hai chấm (:) và cái value nằm trong cắp dấu ngoặc kép (“”) tiếp theo. Các cặp key-value này thì nằm trong dấu ngoặc nhọn và được ngăn cách với nhau bới dấu phẩy (,). Mỗi một file json là một ngôn ngữ mà ứng dụng của bạn hỗ trợ, bấy nhiêu ngôn ngữ thì sẽ có bấy nhiêu file json.
Cách thức hoạt động như sau, khi ngôn ngữ mặc định của máy bạn đang là tiếng Việt, ứng dụng sẽ lấy value của phần tử có key là key được truyền vào trong file vi.json để hiển thị . Khi bạn thay đổi ngôn ngữ sang tiếng Anh, chỗ hiển thị vẫn là key đó nhưng nội dung được lấy từ file en.json. Nghĩa là khi bạn muốn dịch từ tiếng Việt sang tiếng Anh, bạn phải sử dụng hai cái key giống nhau ở cả 2 file đó, khác nhau là phần value thôi.
Để sử dụng được hai file này, bạn cần khai báo nó trong file pubspec.yaml. Mở file pubspec.yaml lên, bạn thêm vào dưới cùng file đó đoạn code sau:
# Lưu ý tab vô một cái rồi mới assets nhaassets:# thay chỗ này thành tên thư mục bạn đặt, như của mình đặt là lang# Chỗ này tab vô một lần nữa- lang/
Tiếp theo, chúng ta cần thêm một package có tên là “flutter_localizations”, dùng để xác định ngôn ngữ mặc định của máy. Bạn thêm đoạn code sau dưới phần dependencies, nhớ là tab vô một cái nha.
flutter_localizations:sdk: flutter
Ok! Vậy là đã xong phần thêm file ngôn ngữ và package. Hãy sang phần tiếp theo!
Ứng dụng mẫu
Giờ bạn hãy mở file main.dart trong thư mục lib ra và copy đoạn code bên dưới mình đã code sẵn một ứng dụng demo. Ứng dụng đơn giản chỉ gồm một AppBar, hai dòng chữ ở chính giữa màn hình thôi nên mình sẽ không giải thích gì thêm.
Mỗi một Locale là mỗi một ngôn ngữ mà ứng dụng của bạn hỗ trợ, tương ứng với đó là mỗi một file json khác nhau. Bên trong Locale, bạn truyền vào 2 tham số, đầu tiên là mã ngôn ngữ (ví dụ ‘vi’) kế đến là mã quốc gia (ví dụ ‘VN’). Ở đây mình chỉ ví dụ hai ngôn ngữ là tiếng Anh và tiếng Việt thôi nên chỉ có hai Locale. Tiếp theo bạn thêm thuộc tính localizationsDelegates có các giá trị như bên dưới:
AppLocalizations là một class mà chúng ta sẽ định nghĩa sau, nó dùng để đảm bảo rằng các file json đã được load để sẵn sàng sử dụng các cái chuỗi trong file đó để hiện thị ngôn ngữ đó. GlobalMaterialLocalizations được dùng để dịch các Widget được build sẵn chẳng hạn như một cái dialog thông báo có các nút Hủy hay Đồng ý dì đó, chúng ta sẽ không thể can thiệp, ứng dụng sẽ tự chuyển ngôn ngữ cho chúng ta nếu như bạn thêm dòng này. Và cuối cùng, GlobalWidgetsLocalizations là dùng để chuyển đổi giữa Left to right hoặc là Right to left, vì có một số ngôn ngữ sẽ đọc ngược lại với chúng ta (ví dụ Nhật Bản).
Dờ chúng ta cần kiểm tra xem là mã ngôn ngữ và mã quốc gia có nằm trong danh sách ngôn ngữ được hỗ trợ hay không bằng cách như sau: cho biến supportedLocale duyệt qua từng phần tử trong mảng supportedLocales (đã khai báo ở thuộc tính supportedLocales ở trên), nếu như mã ngôn ngữ và quốc gia trùng khớp thì trả về supportedLocal. Nếu như duyệt qua tất cả rồi mà vẫn không có khớp với phần tử nào, ta cần phải trả về một giá trị mặc định cho nó, ở đây mình sẽ trả về giá trị là phần tử đầu tiên của mảng supportedLocales (nghĩa là mặc định sẽ hiển thị tiếng Việt).
Ok! Giờ là lúc thêm class AppLocalizations. Các bạn tạo file app_localizations.dart bên trong thư mục lib. Do đoạn này khá dài và phức tạp, bản thân mình cũng không hiểu rõ được nên mình sẽ để code phía bên dưới, giải thích một số chỗ quan trọng, các bạn chỉ cần copy vào file vừa tạo là được.
import'dart:async';import'dart:convert';import'package:flutter/material.dart';import'package:flutter/services.dart';classAppLocalizations{final Locale locale;AppLocalizations(this.locale);static AppLocalizations of(BuildContext context){return Localizations.of<AppLocalizations>(context, AppLocalizations);}staticconst LocalizationsDelegate<AppLocalizations> delegate =_AppLocalizationsDelegate();
Map<String, String> _localizedStrings;// Load file json vào bộ nhớ
Future<bool>load()async{// Đọc file json dưới dạng chuỗi
String jsonString =await rootBundle.loadString('lang/${locale.languageCode}.json');// Giải mã file json sang Map
Map<String,dynamic> jsonMap = json.decode(jsonString);// Sau đó dùng hàm map() để đưa Map<String, dynamic> về Map<String, String>// và gán cho biến _localizedStrings
_localizedStrings = jsonMap.map((key, value){returnMapEntry(key, value.toString());});// Đoạn này cũng không cần thiết phải trả về giá trị nào// Bạn có thể để Future không cũng được và không cần returnreturntrue;}// Đoạn này đơn giản chỉ là lấy giá trị đang// được lưu tại cái key được truyền vào
String translate(String key){return _localizedStrings[key];}}class_AppLocalizationsDelegateextendsLocalizationsDelegate<AppLocalizations>{const_AppLocalizationsDelegate();@override
bool isSupported(Locale locale){// Bạn thêm tất cả các ngôn ngữ ứng dụng của bạn hỗ trợ tại đâyreturn['vi','en'].contains(locale.languageCode);}@override
Future<AppLocalizations>load(Locale locale)async{// Gọi hàm load json được định nghĩa trong class bên trên
AppLocalizations localizations =newAppLocalizations(locale);// Đợi load xong mới return về giá trịawait localizations.load();return localizations;}@override
bool shouldReload(_AppLocalizationsDelegate old)=>false;}
Mọi thứ gần như đã hoàn tất, giờ bạn chỉ việc sử dụng thôi. Hãy quay lại với file main.dart ban đầu, thêm file app_localizations.dart vào.
import'app_localizations.dart';
Để sử dụng, bạn thay đoạn chuỗi trong Widget Text thành như sau:
AppLocalizations.of(context).translate(<key>)
Cài key chính là cái key trong file json bạn đã thêm, ở đây ban đầu mình có hai cái key là hello và welcome, như vậy thì nó sẽ lấy chuỗi tại phần tử có key này để hiển thị. Vậy mình sẽ có là:
Có một lưu ý nhỏ các bạn chú ý, các cái Text được dịch phải nằm trong một Class khác không nằm trực tiếp trong thuộc tính home của MaterialApp nếu không sẽ gây lỗi. Nghĩa là bạn phải tách ra ví dụ như trong ứng dụng demo của mình là class HomePage, rồi mình gọi HomePage() trong thuộc tính home của MaterialApp chứ không đặt trực tiếp Widget vào thuộc tính home.
Vậy là mình đã hoàn thành xong rồi. Bạn có thể xem code trên github tại đây.
Tận hưởng thành quả
Giờ bạn có thể lưu tất cả lại và chạy ứng dụng. Khi máy mình đặt ở chế độ tiếng Anh thì ứng dụng sẽ như thế này:
flutter_localization tiếng Anh
Và khi đổi thành tiếng Việt, ứng dụng sẽ tự thay đổi mà không cần phải khởi động lại:
flutter_localization tiếng Việt
Và mặc định, nếu máy của chúng ta đang ở một ngôn ngữ nào đó không được hỗ trợ thì sẽ hiển thị tiếng Việt.
Tổng kết
Vậy là ở trong bài viết này mình đã hướng dẫn các bạn cách hỗ trợ đa ngôn ngữ trong flutter. Hi vọng bài viết của mình hữu ích với các bạn, hãy chia sẻ nếu bạn thấy hay vì nó luôn miễn phí. Cảm ơn các bạn đã đọc bài viết!
Bài viết được sự cho phép của tác giả Lê Xuân Quỳnh
Chào các bạn!
Lâu nay tôi không viết bài nên không biết các bạn đã quên tôi và blog này chưa. Hôm nay tôi giới thiệu tới các bạn là fan hâm mộ của C++ 1 design pattern mới. Tôi chả gọi tên nó là cái mẹ gì. Chỉ mong khi đọc xong bài bạn áp dụng được vào công việc của bạn.
Trước hồi sinh viên, tôi học kế thừa bằng ví dụ đơn giản như sau:
Có 3 lớp con người, chó, chim. Mỗi loại ăn 1 thứ. Ví dụ tôi có phương thức ăn. Lớp con người in ra màn hình là ăn cơm. Lớp chó là ăn cứt và lớp chim là ăn giun, chẳng hạn thế. Tôi nghĩ ngay tới việc tạo ra lớp Động vật chứa phương thức ăn và in ra: ăn cái gì đó. Sau đó các lớp kia kế thừa lại.
Mô tả code:
Vấn đề ở đây là bạn cần tạo ra lớp Cá cũng ăn giun và bạn lại phải viết lại phương thức lớp Cá y hệt lớp Chim.
Nhiều con cùng ăn 1 loại thức ăn như Hổ, Báo đều ăn thịt các con khác. Vậy kế thừa ở trên chả giải quyết được vấn đề dùng lại code tý nào.
Vậy bây giờ bạn nghĩ ngay chuyện hay là tạo ra interface kiểu như này:
Rồi cho các lớp con người, chó, chim kế thừa và bắt buộc phải viết lại hàm An. Nhưng cũng chả giải quyết được gì cả. Code vẫn phải viết lại!!!
Giải quyết như nào. Bây giờ bạn nghĩ, mình phải nghĩ tới cách tạo ra 1 lớp phân biệt ăn các loại thức ăn khác nhau, và khi loại động vật nào ăn cái gì thì bạn set cho loại đó.
Ví dụ bạn muốn con người ăn cơm thì bạn set cho ăn cơm, chó thích ăn cơm bạn cũng có thể set cho ăn cơm được. Linh hoạt hơn. Cách triển khai như sau:
Bạn tạo ra 1 lớp giao diện:
Lớp này đảm bảo khi ông nào kế thừa lại nó thì bắt buộc phải viết lại hàm An().
Sau đó tạo ra các lớp ăn các loại thức ăn khác nhau như sau:
Đấy là ví dụ 1 số kiểu ăn. Bạn có thể thêm ăn giun sán đỉa nhái sau này.
Bây giờ quay lại lớp động vật ban đầu bạn sẽ thiết kế như sau:
Đến đoạn này bạn sẽ hỏi vì sao tôi thiết kế như vậy. Ở cái lớp động vật lúc vào bài, tôi dùng quan hệ kế thừa, is a. thì nay tôi sẽ dùng quan hệ bao hàm, has a. Nghĩa là sao? Tôi tách biệt ra để việc ăn uống như nào không ràng buộc các lớp động vật kế thừa nó. Tôi dùng con trỏ, tôi set cách hoạt động cho nó. Trong hàm ăn của lớp này, tôi gọi tới hàm ăn của cụm cách hoạt động. Sau này bạn có thể thêm 1 số cách khác như ỉa đái, quan hệ, sinh nở.v.vv
Bạn chú ý hàm hủy tôi để virtual vì để nó check hết các lớp kế thừa trước khi gọi nó. Trong hàm hủy tôi check biến con trỏ đó đã tạo chưa, nếu tạo thì mới tiến hành xóa. Ở hàm Ăn tôi cũng check trước khi in ra không là lỗi bỏ mịa nếu như nó không set trước mà đã gọi rồi.
Bạn cũng sẽ dễ hình dung khi bạn set cách hoạt động là ăn gì thì nó gọi tới hàm của thể loại ăn uống đó. Rồi bây giờ ta tạo 2 lớp demo sau:
Đấy, tôi kế thừa chó hay người đều từ động vật. Sau đó trong hàm main tôi làm demo như sau:
Ở đây tôi tạo ra 2 đối tượng chó và người bằng con trỏ. Tôi new và tôi set cách ăn uống là ăn cơm hay cứt như trên. Sau đó bạn chạy thì nó ra con gì ăn cái gì. Bạn có thể set lại ăn cái gì đó tùy ý bạn.
Đây là kết quả:
Vậy là bạn đã dùng 1 design pattern trong C khá là hay rồi đấy.
Bạn code đi code lại 100 lần bài này cho hiểu thì thôi nhé. Thanks
ps: Rõ ràng việc học code sẽ hay hơn nếu ta biết áp dụng vào công việc. Ở đây tôi nêu ra vài ví dụ anh em tự code xem:
Tạo 1 lớp hình học. Triển khai hàm draw cho các lớp kế thừa hình vuông, hình tròn,… theo cách trên.
Diễn đàn Tiếp thị Di động Việt Nam 2020, thuộc chuỗi sự kiện MMA IMPACT sẽ được tổ chức tại TP. Hồ Chí Minh vào ngày 19/11/2020, với nhiều nội dung đột phá giúp các nhà tiếp thị phát huy hết các tiềm năng và chung tay kiến tạo tương lai của Tiếp thị hiện đại.
Diễn đàn về tiếp thị di động lớn nhất trong năm mà các marketers không thể bỏ qua
MMA Impact Việt Nam là một trong chuỗi sự kiện toàn cầu do Hiệp Hội Tiếp thị Di Động (MMA), Hiệp hội toàn cầu hàng đầu về tiếp thị di động đứng ra tổ chức, là cơ hội để các chuyên gia đầu ngành thảo luận và chia sẻ về các xu hướng và thách thức sắp tới của ngành tiếp thị di động. Năm nay, khi hầu hết các nước Châu Á Thái Bình Dương đều diễn ra trực tuyến, MMA Impact tại Việt Nam sẽ vẫn được tổ chức offline.
Được tổ chức bởi Hiệp hội Mobile Marketing (MMA) Việt Nam – đơn vị uy tín với hơn 45 công ty thành viên tại Việt Nam, đại diện cho đa phần hệ sinh thái Mobile Marketing, MMA Impact Việt Nam 2020 hứa hẹn sẽ quy tụ hơn 400 nhà lãnh đạo doanh nghiệp và các nhà tiếp thị hàng đầu đến từ nhiều lĩnh vực khác nhau. Ban điều hành của MMA bao gồm các đại diện tiêu biểu đến từ: Adtima, Abbott, Cốc Cốc, Dentsu Aegis Network, FrieslandCampina, FECredit, Google, GroupM, Unilever Vietnam, Suntory PepsiCo Vietnam, Biti’s, Pinetech…
Bằng hệ sinh thái và nền tảng của mình, MMA đã khẳng định vai trò dẫn đầu trong việc thúc đẩy ngành tiếp thị di động, kết nối các doanh nghiệp, và tạo sân chơi cho các doanh nghiệp Việt tìm kiếm cơ hội hợp tác và phát triển thông qua các sự kiện thường niên như MMA Impact (tên gọi cũ là MMA Forum).
MMA Impact 2020 và sứ mệnh kiến tạo tương lai của ngành tiếp thị hiện đại
Xoay quanh chủ đề “Kiến tạo tương lai của Tiếp thị hiện đại”, MMA Impact 2020 được thiết kế để nâng cao và xây dựng tiềm năng “modern marketing” (marketing hiện đại) của các nhà tiếp thị. Diễn đàn mang mục đích hội tụ các nhà tiếp thị, nhà phát triển công nghệ, các agency và toàn bộ hệ sinh thái để tìm hiểu và giải quyết những thách thức ngày càng lớn mà ngành tiếp thị di động phải đối mặt; đặc biệt là trong thời đại mà họ phải luôn bắt kịp tốc độ phát triển của công nghệ cũng như đáp ứng được kỳ vọng của người tiêu dùng ngày càng tiến bộ về công nghệ lẫn ý thức xã hội.
Rohit Dadwal, Giám đốc Điều hành MMA Châu Á Thái Bình Dương cho biết: “Tiếp thị hiện đại đã trở thành một phần quan trọng của hệ sinh thái đối với các thương hiệu và người tiêu dùng do tác động của COVID-19 lên ngành công nghiệp này. Từ sự thay đổi vai trò của công nghệ đến nhận thức của người tiêu dùng trong kỷ nguyên kỹ thuật số hiện nay, các nhà tiếp thị phải nắm rõ các chiến lược tiếp thị hiện đại để đạt được tăng trưởng kinh doanh. Tôi đặc biệt khuyến khích tất cả những cá nhân trong hệ sinh thái đăng ký tham gia MMA Impact để tìm hiểu họ kiến tạo tương lai của tiếp thị hiện đại bằng cách nào.”
Rohit Dadwal, Giám đốc Điều hành MMA Châu Á Thái Bình Dương
Lắng nghe và học hỏi từ những chuyên gia hàng đầu về tiếp thị di động
Đến với sự kiện có 1-0-2 này, người tham dự sẽ có cơ hội giao lưu trực tiếp với các diễn giả nổi tiếng, nhiều năm kinh nghiệm các công ty, tập đoàn, agency lớn. MMA Impact 2020 sẽ có sự tham gia của các nhà lãnh đạo từ lĩnh vực tiếp thị, quảng cáo và truyền thông. Một số diễn giả đã được xác nhận tại MMA Impact Việt Nam bao gồm bà Nguyễn Thị Bích Vân – Chủ Tịch của Unilever Việt Nam, ông Tom Simpson – Phó Giám đốc khu vực Châu á Thái Bình Dương của AdColony, Bessie Lee – Nhà sáng lập và CEO của Withinlink, ông Shankar Rajagopal – Giám Đốc Điều Hành của Mindshare Việt Nam, ông Nguyễn Vũ Anh – Phó Tổng Giám Đốc của Cốc Cốc, Bà Trâm Nguyễn – Giám Đốc Quốc Gia Việt Nam/ Lào/ Campuchia của Google.
Người tham gia sẽ có cơ hội networking với hơn 500 người tham dự là C- level rất nhiều nhãn hàng, agency trong hệ sinh thái mobile marketing trong nước và quốc tế
Một số chủ đề tiêu biểu sẽ được thảo luận và chia sẻ tại MMA Impact bao gồm:
Phát triển MarTech
Sự gia tăng của giọng nói và âm thanh
Dịch vụ đa phương tiện (OTT) và phát trực tuyến
Tương lai của thanh toán di động
E-commerce 4.0: Thời đại e-commerce bằng live streaming
Tiếp thị toàn cầu: Góc nhìn về công nghệ và truyền thông mới
Ngoài ra, người tham dự còn được tham gia vào một hệ sinh thái duy nhất dành riêng cho các công ty nội địa và thiết lập mối quan hệ chặt chẽ với các thành viên khác. Với bản danh sách “phong phú” những diễn giả, khách mời và doanh nghiệp, MMA Impact 2020 là dịp để người tham gia tìm cơ hội networking với các C-level của rất nhiều công ty, tập đoàn lớn trong và ngoài Việt Nam. Từ đó, nhiều cơ hội hợp tác kinh doanh mới sẽ được thiết lập, đóng góp vào sự phát triển ngày càng mạnh mẽ của mạng lưới các nhà tiếp thị Việt Nam.
MMA Impact Việt Nam 2020 sẽ được tổ chức vào lúc 8:00 – 12:00 ngày 19/11/2020 tại TP.HCM Tất cả các CEO và CMO từ các doanh nghiệp, nhãn hàng, agency, tập đoàn công nghệ, viễn thông,… đều được chào đón tại sự kiện.
Và đừng quên tham dự Đêm trao giải Smarties để cùng theo dõi danh sách các chiến dịch tiếp thị di động xuất sắc nhất sẽ được vinh danh vào cùng ngày – 19/11/2020 sắp tới.
Giới thiệu về Hiệp hội Tiếp thị Di động (MMA)
MMA là hiệp hội tiếp thị di động thương mại phi lợi nhuận hàng đầu thế giới bao gồm hơn 800 công ty thành viên, đến từ gần 50 quốc gia trên thế giới. Các thành viên của chúng tôi đến từ mọi mảng trong hệ sinh thái tiếp thị di động, bao gồm brands marketer, agency, nền tảng công nghệ, công ty truyền thông,… Sứ mệnh của MMA là đẩy nhanh quá trình chuyển giao và đổi mới của marketing thông qua thiết bị di động, thúc đẩy tăng trưởng kinh doanh với sự tương tác mạnh mẽ hơn của người tiêu dùng. Dẫn dắt sứ mệnh của MMA là bốn trụ cột cốt lõi: Nuôi dưỡng cảm hứng bằng cách thúc đẩy sự đổi mới cho các CMO; Xây dựng tiềm năng tiếp thị di động cho các tổ chức tiếp thị thông qua việc cung cấp kiến thức và sự tự tin; Nâng cao hiệu quả và tác động của thiết bị di động thông qua nghiên cứu ROI hữu hình; và ủng hộ các nhà tiếp thị di động. Ngoài ra, các Committee của MMA còn hợp tác để phát triển và hỗ trợ các phương pháp tốt nhất và tiên phong trong những phát triển đúng tiêu chuẩn.
Các thành viên của MMA tại Việt Nam bao gồm Facebook, Google, CocCoc, Adtima, GroupM, Coca-Cola, Unilever,… và rất nhiều tên tuổi lớn khác. Trụ sở toàn cầu của MMA được đặt tại New York với các hoạt động khu vực ở Châu Âu / Trung Đông / Châu Phi (EMEA), Châu Mỹ Latinh (LATAM) và Châu Á Thái Bình Dương (APAC). Để biết thêm thông tin về MMA, vui lòng truy cập www.mmaglobal.com.
Bài viết được sự cho phép của tác giả Nguyễn Chí Thức
Copy một list
Giả dụ chúng ta có đoạn code sau:
>>> A = [1, 2, 3, 4, 5]
>>> B = A
thì nếu chúng ta in list B thì sẽ được các phần tử của list A, nhưng thực ra B chỉ là một biến tham chiếu đến A trong bộ nhớ, tức là thực chất trong bộ nhớ chỉ có 1 list [1, 2, 3, 4, 5] và cả A và B cùng trỏ đến list đó chứ không phải A và B có 2 list giống nhau.
Còn trong dòng code trên thì chúng ta mới thực sự tạo ra một list khác là C có các phần tử giống như list A.
Bây giờ chúng ta thử đổi một phần tử trong list A:
>>> A[0] = 8>>> A
>>> [8, 2, 3, 4, 5]
>>> B
>>> [8, 2, 3, 4, 5]
>>> C
>>> [1, 2, 3, 4, 5]
Rõ ràng khi in list A và B đều cho kết quả giống nhau vì chúng cùng tham chiếu tới một list, nhưng C thì lại khác vì các phần tử trong list C tồn tại độc lập.
Khởi tạo giá trị mặc định cho đối tượng Dictionary
Các đối tượng Dictionary được tạo ra là rỗng. Nhiều khi chúng ta làm việc với Dictionary mà không biết khóa đó có giá trị hay chưa nên truy xuất giá trị sẽ bị lỗi, do đó chúng ta có thể dùng phương thức get() rồi truyền thêm giá trị mặc định vào, tức là nếu khóa đó không có giá trị thì Python sẽ gán giá trị mặc định vào luôn.
Bạn có thể gán một lúc nhiều giá trị vào nhiều biến. Tính năng này đặc biệt hữu ích cho việc hoán đổi giá trị giữa 2 phần tử. Với Python bạn không cần phải khai báo biến tạm như temp = a; a = b; b = temp; để thực hiện công việc hoán đổi giá trị nữa.
>>> x, y = 1, 2#multiple assignment>>> x
1>>> y
2>>> x, y = y, x #swapping>>> x
2>>> y
1
Và bạn được yêu cầu viết một đoạn code Python để hiển thị kết quả như sau:
1 first
2 second
3 third
Thì lúc này bạn có thể sử dụng hàm zip:
for a, b in zip(my_numbers, my_numbers_in_english):
print a, b
Rất hữu ích phải không nào, chúng ta nhận được kết quả như ý muốn với số lượng đoạn code tối thiểu phải viết điểu này không phải lúc nào cũng dễ dàng với các ngôn ngữ script khác.
Selenium ở đây tất nhiên không phải là “Selenium là khoáng chất vi lượng quan trọng trong nhiều hoạt động như xử lý não bộ, miễn dịch và sinh sản“
Không phải là thuốc nha mấy thím. Đang nhắc tới automation test tools
Selenium được nhắc tới trong bài viết là AUTOMATIONS TEST TOOLS (kiểm thử phần mềm hoặc website tự động).
Định nghĩa nhàm chán nhưng cũng cần phải biết là:
Selenium is an umbrella project for a range of tools and libraries that enable and support the automation of web browsers.
Selenium là dự án “ô dù” với mục đích tạo ra các công cụ (tools) và thư viện (libraries) tự động hóa các trình duyệt web.
Ngoài ra, một từ khóa quan trọng đễ dễ nhớ hơn là:
It provides extensions to emulate user interaction with browsers
Selenium cung cấp các tiện ích mở rộng mô phỏng sự tương tác của người dùng với browser.
Định nghĩa loằng ngoằng là vậy, nhưng với Selenium, ta có thể mô phỏng hầu hết những thao tác người dùng với trình duyệt (nhấp – click, cuộn – scroll, đóng tab, click check box, …)
2. Ưu điểm của Selenium
Hiện tại, danh sách Top 10 Automation Testing Tools đã bao gồm nhiều cái tên (mabl, randorex). Tuy nhiên, Selenium vẫn là một cái gì đó khó thay thế, vẫn nổi bật và có nhiều giá trị.
Giới QC trong giang hồ hẳn ai cũng biết về Automation test tools này. Vang danh khắp thiên hạ.
2.1 Hỗ trợ nhiều ngôn ngữ lập trình
Bản thân mình, trong quá trình làm việc cho công ty cũng được tiếp xúc với selenium một vài lần. Cụ thể là với Webdriver Java, Javascript và Python.
Hiện tại hỗ trợ tới 6 ngôn ngữ lập trình: Java, Python, C#, Ruby, JavaScript và Kotlin. So far, so good.
Nguồn/ Source: selenium.dev
2.2 Miễn phí – free
Khỏi phải nói, ưu điểm này thật sự là đáng tiền nhất của Selenium, so với các đối thủ khác như Ranorex hoặc Mabl, Selenium hoàn toàn miễn phí. Chính vì vậy, nó thường được các doanh nghiệp IT Nhật Bản tin dùng.
Tất nhiên với Java, ta có ngay slogan quen thuộc: “Viết một lần – Chạy khắp nơi“, làm gì chả thích. “Run once time, run everywhere”.
2.3 Dễ hiểu, dễ sử dụng
2.4 Hỗ trợ đa trình duyệt với Webdriver
Selenium hỗ trợ test tự động trên nhiều browser. Hỗ trợ tốt khi khách hàng cần test trên nhiều phiên bản, nhiều loại browser khác nhau (thường thì chắc chắn sẽ yêu cầu như vậy).
Đối với môt số khách hàng từ Nhật hay cơ quan chính phủ, yêu cần website hoạt động tốt trên IE 9,10,11,. Việc viết test case một lần và chạy trên nhiều trình duyệt là vô cùng tiện lợi và nhanh chóng.
Hỗ trợ Internet Explorer, tin vui cho mấy anh em phát triển phần mềm chính phủ
2.5 Dễ dàng take evidence khi chạy
Thực tế khi làm việc, khách hàng lúc nào cũng yêu cầu evidence khi thực hiện chạy testcase.
Khi một website đã hoàn thiện để chạy automation test, nếu có lỗi xảy ra, ngoài ghi log hoặc báo file, yêu cầu cần thiết nhất luôn là chụp evidence (bằng chứng) ngay lúc đó.
Selenium hỗ trợ rất tốt cho những trường hợp muốn chụp lại màn hình. Kể cả trong trường hợp page ở website là scroll. Mình đã từng sử dụng Selenium để chụp những
3. Một số nhược điểm
Mặc dù có nhiều ưu điểm không phải automation test tools nào cũng có. Selenium vẫn tồn tại một số yếu điểm dưới đây:
3.1 Muốn chạy ổn, hãy cố handle timeout
Một nhược điểm cố hữu có các Automation test tools (không ngoại trừ Selenium) là timeout. Trường hợp sử dụng để kiểm thử cho website, tốc độ mạng có thể khác nhau giữa những lần chạy testcase. Chắc chắn là không giống nhau giữa các lần chạy.
Việc chạy automation test vào lúc mạng chậm, traffic đang stuck có thể làm fail một số testcase. Trong những trường hợp như vậy, cần xử lí tốt các trường hợp timeout.
Thực tế, trong quá trình làm việc, mình thấy các Exception Timeout thường do:
Mình đang test ở page 1 -> nhấn button A -> di chuyển tới page 2 -> tìm kiếm button B. Các hàm tìm kiếm có thể là (getElementById(), getElementByTag(), …).
Nuột nà là thế, nhưng do mạng chậm, nên lúc tới page 2 vẫn không tìm được button B -> văng Exception.
Trường hợp muốn handle exception, có thể đọc thêm bài viết này ở KieBlog.
3.2 Nếu không kiểm soát tốt, hết ram, chết đứng
Thông thường, mỗi testcase sẽ khởi chạy với một new instance của browser ta muốn chạy. Tuy nhiên, nếu có vấn đề, hoặc ta không thể handle các trường hợp cần đóng browser. Rất có thể có các trường hợp sau:
Không thể tìm đúng đối tượng trên browser do instance của browser cũ chưa tắt (close)
Quá tải ram do nhiều trình duyệt mở (nhất là chrome)
Không khó để tìm những câu hỏi rằng không thể đóng được browser đã mở.
Có rất nhiều nguyên nhân dẫn tới trường hợp này. Nếu trước đó đã có exception không được catch or throws, sẽ không thể close instance browser đã mở.
4. Tổng kết
Đọc tới đây, chắc hẳn các thím cũng có đã có cái nhìn “sơ sơ” về Selenium. Để hiểu sâu hoặc bắt đầu thực tế sử dụng, hãy chú ý xem các bài viết tutorials ở phần tham khảo.
Cảm ơn đã đọc bài của mình và hãy cố gắng sử dụng Selenium một lần cho biết nhé, nó bá đạo lắm đấy!.
Applaydu hiện đã có thể tải xuống miễn phí từ App Store hoặc từ Google Play Store.
Chỉ sau 15 tháng, Gameloft for brands và Kinder đã ra mắt ứng dụng Applaydu – một dự án đầy tham vọng – mang các nhân vật đồ chơi của Kinder vào đời sống thực tế thông qua Thực tế tăng cường (AR) với một thế giới đầy những điều thú vị đang chờ được khám phá.
Applaydu là một ứng dụng giáo dục trên điện thoại, được thiết kế cho trẻ em từ 3 đến 9 tuổi. Tại đây, các bé có thể khám phá nhiều trò chơi đầy thú vị, giúp các bé học đếm, làm quen với ngôn ngữ và mở rộng kiến thức về các quốc gia, địa lý và cả động vật.
Một đoàn làm phim chuyên nghiệp đã đến thăm Gameloft Sài Gòn Studio để có thể nắm bắt được kĩ càng nhất quá trình phát triển suốt 15 tháng của dự án Applaydu. Qua đó, “Creating Applaydu” – một phim tài liệu dài 15 phút đầy gần gũi và cảm động đã ra đời, thể hiện cận nét từng bước hành trình sáng tạo của cả nhóm. Bạn sẽ nhận ra rằng chuyên môn và niềm đam mê của từng thành viên trong team có thể giúp họ đạt được những điều to lớn như thế nào.
Đội ngũ Applaydu tại trụ sở Gameloft Sài Gòn Studio
Thế giới đã thay đổi rất nhiều kể từ khi Kinder Surprise phát hành cách đây 50 năm: trẻ em ngày nay được sinh ra với công nghệ và dành phần lớn thời gian của chúng trên điện thoại thông minh. Để bắt kịp với thời đại, Ferrero Group muốn nâng cao trải nghiệm của trẻ em bằng cách kỹ thuật số hóa những đồ chơi bình thường. Là một chuyên gia trong ngành công nghiệp game suốt 20 năm, Gameloft for brands đã giúp Ferrero đưa chiến lược của họ lên một tầm cao mới bằng cách tạo ra một ứng dụng, nơi mà trẻ em có thể vừa học vừa chơi. Đây cũng là dự án đầu tiên do Gameloft sáng tạo 100% bởi Gameloft for brands tại Sài Gòn.
Applaydu là một ứng dụng giáo dục trên điện thoại được thiết kế cho trẻ em
Một trong những thách thức lớn nhất là trò chơi được tạo ra cho các bé từ 3 đến 9 tuổi. Trong khi đó, trẻ 3 tuổi sẽ có mức độ phát triển khác với trẻ 9 tuổi, hay thậm chí 2 đứa trẻ ở cùng độ tuổi có thể có những mức độ phát triển khác nhau. Từ đó, nhóm đã đưa ra giải pháp, rằng độ khó trong trò chơi sẽ tự động thay đổi dựa trên các lần chơi trước của trẻ, vì vậy việc lựa chọn mức độ trò chơi sẽ không còn là mối bận tâm của bố mẹ nữa.
Một thách thức khác của Applaydu là các bé ở độ tuổi đang phát triển sẽ không hiểu các cơ chế trừu tượng, biểu tượng hoặc trò chơi như người lớn. Vì vậy, giao diện người dùng và trải nghiệm người dùng (UX / UI) phải thật đơn giản và dễ hiểu.
Menu chính của Applaydu được thiết kế như phòng ngủ của các bé
Nhóm còn muốn cung cấp cho các bé một vũ trụ hữu hình, một nơi mà trẻ có thể “chạm vào”, và trong đó những sáng tạo của trẻ sẽ trở thành hiện thực. Nhóm cũng đã nảy ra ý tưởng về một thế giới thủ công, được làm từ những đồ vật trong đời sống (hộp đựng giày, bưu phẩm, bìa cứng,…) giúp tạo ra những sản phẩm sáng tạo mà ngay cả những đứa trẻ cũng có thể tự làm được. “Trên hết, chúng tôi muốn truyền cảm hứng cho các bé. Giờ đây, các bé có thể xây dựng thế giới của riêng mình ngay tại nhà bằng cách sử dụng mọi thứ ở xung quanh.” – Cédric Ratajczak, Giám đốc Sáng tạo cho biết.
Với tham vọng mang đồ chơi vào cuộc sống theo đúng nghĩa đen và tạo ra một kết nối riêng giữa trẻ em và đồ chơi của chúng, đội ngũ Applaydu đã dựa trên hình ảnh ban đầu của đồ chơi và khuếch đại các đặc điểm của chúng. Có thể dễ dàng nhận ra rằng tất cả các thiết kế nhân vật đều đồng nhất với đồ chơi của Kinder cũng như thể hiện được thế giới vui nhộn của Applaydu.
Đội ngũ Applaydu trong quá trình làm việc
Là một trong những nhà phát hành game di động hàng đầu thế giới, Gameloft luôn có trách nhiệm với sản phẩm của mình, đặc biệt là với trẻ em. Chính vì thế, đội ngũ vận hành đã hợp tác với các chuyên gia giáo dục hàng đầu tại Đại học Oxford để đảm bảo những câu chuyện trong Applaydu sẽ trở thành một công cụ hỗ trợ phụ huynh trong việc dạy học cho bé. Applaydu hiện đã chính thức nhận được Chứng nhận Ứng dụng Giáo dục (EAS) và Chứng nhận kidSAFE + COPPA.
Nói về Gameloft, studio đầu tiên tại Việt Nam được mở vào năm 2004, với tham vọng đưa các game của Gameloft lên tất cả các thiết bị di động hiện có. Cho đến nay, sau 16 năm phát triển, với chuyên môn của mình, đội ngũ sáng tạo của Gameloft for brands tại Sài Gòn đã cùng nhau tề tựu tại đây để mang đến một sự bùng nổ – ứng dụng Applaydu dành cho Kinder! Đứng sau Applaydu là đội ngũ gồm 50 nhân tài đến từ Sài Gòn Studio, một trong những studio Gameloft lớn nhất thế giới. Thierry Lecat, Giám đốc điều hành, cho biết: “Các thành viên trong nhóm đều trẻ trung và tràn đầy năng lượng. Chúng tôi được coi là một ‘team quốc tế’ vì có tới 9 quốc tịch với nhiều xuất thân khác nhau, nhưng chúng tôi đều có cùng nghị lực, cùng tinh thần đồng đội, cùng tư duy và luôn mang thái độ tích cực trước bất cứ mọi khó khăn”.
Applaydu hiện đã có thể tải xuống miễn phí từ App Store hoặc từ Google Play Store.
Bài viết được sự cho phép của tác giả Kien Dang Chung
Trong lập trình quy chuẩn đầu tiên cần đưa ra là quy chuẩn cho việc đặt tên. Có hàng tỉ thứ cần đặt tên trong lập trình, nói chơi vậy thôi chứ phân loại ra khoảng hơn chục thôi à, ví dụ như tên Class, tên biến, tên phương thức, tên thuộc tính… Có 3 chuẩn để đặt tên là underscore, camelCase và PascalCase.
underscore: sử dụng dấu gạch chân giữa các từ, tất cả các từ đều viết thường, ví dụ: $this_is_my_variable.
camelCase: giống như cách viết của nó, từ đầu tiên viết thường, các từ tiếp theo viết hoa chữ cái đầu, ví dụ $thisIsMyVariable.
PascalCase: viết hoa tất cả các chữ cái đầu, ví dụ $ThisIsMyVariable.
Các quy chuẩn đặt tên thông thường
Sau đây là một số quy chuẩn đặt tên thường dùng trong dự án:
Tên lớp đặt theo PascalCase, ví dụ: UserClass, CategoryClass…
Tên hàm và phương thức sử dụng camelCase, ví dụ getUser, getCategory…
Tên biến cũng sử dụng camelCase loginUser,loginUser,categoryList…
Tên hằng số thì đặc biệt, viết hoa hết và cách nhau bởi dấu gạch dưới DISCOUNT_PERCENT, LIMIT_RATE…
Tên bảng, tên cột trong Database sử dụng underscore và sử dụng danh từ số nhiều, ví dụ bảng oauth_clients, oauth_refresh_tokens.
Tên phần tử trong HTML, ví dụ khi bạn sử dụng Vue.js, React… tạo ra thì nó sẽ có dạng KebabCase, ví dụ <my-component>.
Đặt tên là để gợi nhớ, ví dụ khi gọi đến tên của bạn là người ta biết ngay đó là bạn mà không nhầm sang người khác, đặt tên trong lập trình cũng vậy cần phải tường minh. Trước đây tôi có một người bạn trong cùng cơ quan đặt tên các biến khá thú vị: heheheeeee,heheheeeee,hihiiiiii… vãi cả nón, khi đọc code bò lăn ra cười, nói vui vậy thôi chứ như vậy là không nên, không thể hiểu được các biến này dùng làm gì, đặc biệt hơn nữa là khi xử lý qua lại đánh tên các biến này khó vãi, chắc phải copy cho chắc ăn.
Lời kết
Bạn nên tập thói quen đưa ra một quy chuẩn đặt tên trong lập trình của riêng mình, như vậy khi làm việc theo nhóm các thành viên khác có thể dễ dàng đọc được code của bạn. Hơn nữa, các thư viện mã nguồn mở hiện nay đều tuân thủ theo những quy ước đặt tên, nếu bạn không muốn mình tách rời với cộng đồng hãy tuân thủ theo “pháp luật”.
Ngược ngạo VCL, rõ ràng là phải viết code rồi mới có cái mà test chứ, viết Unit test trước thì run bằng mắt à?. Đấy, lần đầu tiên tìm hiểu kĩ thuật này tôi cũng đặt ra câu hỏi như các ông!.
Vấn đề là mình nghĩ thế nhưng nó lại không phải như thế. Viết Unit Test trước khi Implement là một trong những ý tưởng chủ chốt của TDD (Test Driven Development).
TDD Introduction – Có đọc qua mới biết nha. Nguồn/Source: Medium
Thực chất thì có nhiều cái lợi lắm nha. Để tôi kể cho nghe:
1. Hiểu rõ những gì sắp code
Leader hay Br SE nhận requirements, hoặc là tự mình nhận (nếu làm freelancer bán thời gian như tôi). Với một số requirement đơn giản, không quá bự thì theo như thông thường
Đọc hiểu requirement -> code -> gửi QC hoặc Tester test -> Có bug -> Fix bug
Tuy nhiên, chỉ đọc hiểu requirement để code lại hoàn toàn khác với hiểu requirement để test. Ở tầm test của QC cần hiểu rõ về business, về những case sử dụng thực tế của khách hàng. Trường hợp sử dụng không normal sẽ xảy ra những bug nào?.
Developers have a clear target in mind and that’s very important in agile environment.
Lập trình viên có một mục tiêu rõ ràng trong trí óc là một điều rất quan trọng trong môi trường Agile
Chính vì vậy, viết unit test trước khi code là khoảng thời gian quý báu giúp bản thân xem xét những gì sắp làm. Cần code những gì?
2. Tránh chủ quan
Tại sao dev code thường có bug?. Trời má, thế giới nào mà không có bug?. Hỏi thừa quá ông ơi!.
Ý tôi là nhiều hay ít, ít bug thì rõ ràng dev đó cẩn thận hơn, kĩ tính hơn. Một trong những nguyên nhân lớn khiến dev có nhiều bug vì không tưởng tượng ra hết các kịch bản (scenarios) để test thử trước khi đem cho Tester.
Không những vậy, chủ quan còn mang tới những con bug basic hơn. Chính vì code và có niềm tin mãnh liệt vào code của mình, nên một số bạn để lọt bug do nghĩ chắc đoạn đó code ngon rồi, không bug đâu.
Thế giới nào lại không có bug!. Nguồn/Souce: monkeyuser.com
Sự thật thì. BUG, BUG SML
3. Rèn luyện tính cẩn thận khi viết Unit test
Áp dụng phương pháp này cho mấy thanh niên code ẩu thì khỏi bàn.
Nhiều khi cắm đầu code nhưng chỉ focus vào duy nhất một case (dân trong nghề gọi là happy case). Không quan tâm những case khác -> thành ra bug tè le.
Tuy nhiên nếu viết Unit Test trước, mọi chuyện rõ ràng dễ thở hơn nhiều. Trước khi bắt tay vào code phải lường trước những trường hợp có thể xảy ra.
Unit test vẫn là một trong những yêu cầu chính phải thực hiện nha!
Trở thành Senior Software Engineer không chỉ là code nhanh và xử lí task khó. Senior còn phải code ít bug, ít thời gian maintainance.
4. Lợi ích và hại ích
The test clearly defines what constitutes “done” – Rõ ràng được khi nào thì xong
The test documents how you intend the code to be used – Code được dùng như thế nào
Coding to meet a test case (and nothing else) helps keep you focused on one task and prevents feature creep – Không có các đoạn code dư thừa, chỉ focus làm sao cho match được testcase
Như một số lập trình viên vẫn truyền tai nhau:
“If I was given the choice of losing all of my code or all of my tests, I would choose losing all of my code.”
Nếu được lựa chọn giữa mất toàn bộ code và toàn bộ test, tôi sẽ lựa chọn mất tất cả code của mình.
Tuy nhiên, phương pháp nào cũng phải một vài vấn đề. Đối với TDD (Test Driven Development), ta sẽ gặp một số vấn đề sau:
Viết Unit test không thể viết ẩu, viết ẩu sẽ để lọt case, mà lọt case là lòi BUG.
Người áp dụng phải có khả năng lường trước các vấn đề, tính cẩn thận.
Phải có thời gian (cái này quan trọng nhất).
Một số dự án bị dí SML, hoặc deadline dí tới đít thì code còn không kịp, lấy đâu ra thời gian mà ngồi viết testcase trước. Chính vì vậy, áp dụng kĩ thuật này cần có thời gian.
5. Tham khảo
Đã tìm hiểu về Unit test và kĩ thuật viết Test trước khi code thì tiện thể ngó qua luôn về Selenium Automation Test ở Kieblog. Khỏi phải giới thiệu dài dòng, những năm gần đây Automation Test đang trở nên hot vô cùng.
Không giống như chắp thêm có thể lấy một đối tượng thuộc bất kỳ loại nào làm đối số, phần mở rộng chỉ có thể lấy một đối tượng có thể lặp lại làm đối số.
Một đối tượng có thể lặp lại là một đối tượng mà bạn có thể lặp qua như chuỗi, danh sách, bộ dữ liệu, dicts hoặc bất kỳ đối tượng nào có phương thức __iter__
Những gì extend làm rất đơn giản, nó lặp đi lặp lại thông qua đối tượng lặp lại (iterable ) một mục tại một thời điểm và nối thêm từng mục vào danh sách.
Khối lượng công việc quá lớn khiến bạn trở nên mệt mỏi. Đó cũng chính là lý do bạn chưa biết cách quản lỳ thời gian hiệu quả. Do vậy, bạn tiếc nuối khi đã bỏ lỡ nhiều khoảng thời gian quý giá đó.
Bài viết sau đây, TopDev sẽ chỉ ra cho bạn những cách thức giúp quản lý thời gian hiệu quả nhất. Việc này sẽ giúp bạn giảm căng thẳng và có biểu hiện tốt hơn ở nơi làm việc.
Ủy thác lại nhiệm vụ
Việc bạn đảm đương quá nhiều việc không còn là điều quá xa lạ. Chính việc không biết cách từ chối đã dẫn bạn đến tình trạng kiệt sức. Ủy thác được xem là cách thức phù hợp nhất để giải quyết tình trạng này. Tuy nhiên, điều này không có nghĩa là bạn trốn tránh trách nhiệm của mình.
Hãy học cách ủy thác nhiệm vụ của mình xuống cấp nếu công việc quá nhiều. Việc ủy thác cũng có những điểm tích cực. Bạn sẽ tạo cho cấp dưới cơ hội làm việc phù hợp với năng lực và kỹ năng của họ.
Tính logic – Đảm bảo yếu tố ưu tiên
Mọi thứ sẽ hoàn hảo hơn nếu bạn có một kế hoạch cụ thể trước khi thực hiện. Nó có thể hiểu là một quá trình bao gồm các nhiệm vụ cần thực hiện. Chẳng hạn, nếu bạn muốn ứng tuyển các vị trí IT. Bạn cần tìm hiểu về công ty, loại hình hoạt động. Tiếp đó là chuẩn bị một CV IT tiếng anh hoặc tiếng việt. Đây là điều quan trọng. Bạn có thể sáng tạo CV riêng của mình trên các nền tảng CV online,…
Điều quan trọng, bạn cần phân loại rõ đâu là việc quan trọng – đâu là việc khẩn cấp. Hãy cân nhắc thật kỹ để đảm bảo hiệu suất công việc cũng như các giá trị mang lại cho bản thân bạn.
Một cuốn sổ có thể giúp bạn ghi chép các ý tưởng bất chợt. Bạn có thể dùng các ý tưởng đó để hoàn thiện lịch trình thực hiện các nhiệm vụ. Một điều bạn cần lưu tâm khi lên lịch các nhiệm vụ là đảm bảo tính khả thi.
Để dễ dàng kiểm soát kỹ năng quản lý thời gian, bạn nên thiếp lập mọi thứ xoay quanh các chủ đề trọng tâm: Công việc, Gia đình, Cá nhân.
Hạn chế căng thẳng
Stress thường xuất hiện khi bạn quá mệt mỏi. Nguyên nhân đến từ việc bạn chịu ức ép quá lớn từ công việc. Bạn chưa biết cách quản lý thời gian hiệu quả. Và điều này sẽ ảnh hưởng đến năng suất của bạn. Do vậy, hãy thư giãn. Đừng để bản thân phải rơi vào tình trạng căng thẳng tột độ.
Dealine có ý nghĩa rất quan trọng đối với vấn đề quản lý thời gian. Khi thực hiện Khi một nhiệm vụ nào đó, hãy lên deadline cho nó và thực hiện theo. Hãy cố gắng hoàn thành một cách tốt nhất. Đừng trì hoãn với sự lười biếng vì bạn không lường trước được rất nhiều chuyện đột xuất sẽ xảy ra. Hãy thử thách bản thân và đáp ứng thời hạn. Đừng quên thưởng cho bản thân khi hoàn thành một thử thách khó khăn nhé!
Bắt đầu sớm là cách để thành công
Dù bạn là ai, làm trong lĩnh vực gì thì việc bắt đầu sớm công việc với một tâm thế thoải mái, đó là bí quyết của sự thành công. Bạn không cần đắn đó quá nhiều thứ. Hãy bắt đầu bằng việc hít thở thật sâu. Bạn sẽ có thêm thời gian thư giãn, suy nghĩ và lên kế hoạch làm việc cho một ngày. Nguồn năng lượng làm việc rất quan trọng. Do vậy, hãy bắt đầu sớm với một tinh thần sảng khoái nhất.
Lời kết
Hãy học cách nói từ chối khi bạn cảm thấy mọi thứ quá sức. Đó là lời từ chối lịch sự. Những cân nhắc về những điều mà cần làm, phải làm và sẽ làm. Cụ thể. phân biệt rõ những công việc quan trọng – ưu tiên để đạt hiệu suất công việc một cách tốt nhất. Mọi bí quyết đều chỉ là lý thuyết nếu bạn không áp dụng chúng vào thực tế. TopDev hy vọng, bài viết đã giúp bạn có những tip bổ ích cho việc quản lý thời gian và lập kế hoạch thực hiện các công việc.
FE sẽ ko phải đợi đến khi BE làm xong API mới có thể bắt đầu integrate, nếu bạn có thể mock những API sẽ được trả về dựa trên contract đã thống nhất, thì gần như là không còn quá nhiều việc phải làm khi API làm xong.
Để mock API, kể thể dùng nhiều cách như JSON Server, mountebank, hôm nay mình hướng dẫn dùng Mirage mình mới biết, kết hợp với Vue nhé, React cũng tương tự thôi.
Cài đặt vào devDependencies
npm i miragejs -D
Mình chọn tổ chức thư mục theo kiểu này, bạn có thể để nó ở chỗ khác thì tùy ý
Nếu mọi thứ êm đẹp bạn sẽ được thông báo trên cửa sổ console
Thêm nội dung động
Bạn có thể dùng fakerjs để chèn thêm dữ liệu một cách ngẫu nhiên.
Để có dữ liệu init cho fake server, chúng ta sẽ sử dụng seeds()
exportdefaultfunction({ environment ='development'}={}){seeds(server){
server.db.loadData({
tasks:[{ id:1, text:"Feed the cat"},{ id:2, text:"Wash the dishes"},],})},routes(){this.get('/api/tasks',(schema)=>{return schema.db.tasks;}),this.post('/api/tasks',(schema, request)=>{// nhận data được gửi từ postconst task =JSON.parse(request.requestBody).data;return schema.db.tasks.insert(task);})...},});}
Thêm route động
Route động là gì, ví dụ như bạn dùng phương thức delete hay update bằng một route như thế này
// api/mock/index.js...this.delete('/api/tasks/:id',(schema, request)=>{// id từ urlconst id = request.params.id;return schema.db.tasks.remove(id);})...
Nếu bạn để ý, tất cả đều bắt đầu bằng api, namespace sinh ra là để phục vụ đối tượng lười biếng như chúng ta
routes(){// bọn dưới sẽ bắt đầu bằng /api hếtthis.namespace='/api';this.get('/tasks',()=>{...})this.delete('/tasks/:id',()=>{...})this.post('/tasks',()=>{...})}
Giả lập những route chỉ định
Nếu như bạn đã có một số API, một số BE đang implement, tất nhiên chúng ta chỉ mock những API chưa làm, còn cái nào làm rồi thì cứ xài cái thật luôn
routes(){// chỉ giả lập GET /taskthis.get('/task',()=>{...});// còn lại dùng hàng thậtthis.passthrough();}
Nhưng đa phần API thật sẽ nằm đâu đó chứ không phải localhost:3000, thêm đoạn sau
routes(){// api thực nằm ở đâythis.urlPrefix='https://devenv.ourapp.example';// chỉ giả lập GET /taskthis.get('/task',()=>{...});// còn lại dùng hàng thậtthis.passthrough();}
Lúc này tất cả API đều sẽ gọi lên https://devenv.ourapp.example, duy chỉ gặp thằng https://devenv.ourapp.example/task`, mirage sẽ intercept và đưa hàng giả vào.
Kết
Sử dụng cũng được vài cái thư viện làm mock API, MirageJS là thằng mình thấy ưng nhất, không quá phức tạp, giải quyết được những vấn đề rất căn cơ của FE.
Mirage JS còn khá nhiều chiêu trò thú vị chờ bạn khám phá trên tài liệu chính thức của nó, nếu thấy hay đừng quên nhất like và contribute cho dự án trên Github
Như cái tiêu đề sock hàng, bài viết này chủ yếu nói về việc hạn chế sử dụng if else nhiều nhất có thể.
Viết nhiều if else là phù hợp cho những người mới bắt đầu. Còn khi đã đạt tới “trình” cao hơn, hãy luôn tìm mọi cách để loại bỏ đi các đoạn if else không cần thiết trong souce.
Sử dụng if else nhiều lần gần như là vấn đề mà bất kì Junior Developer nào cũng gặp phải. Cùng xem xét ví dụ dưới đây:
Java
public void checkConditionSomething(int input) {
if (input > 10) {
// Do something in case greater than 10
} else {
// Do some something
}
}
Code như này thường là có code của Junior, suy nghĩ đơn giản. Nếu này thì làm gì, ngược lại thì làm gì. Viết kiểu này tốt cho người mới bắt đầu vì dễ hiểu, dễ áp dụng.
Tuy nhiên, nên nhớ là ta vẫn còn return, một return sẽ đổi được một else. Nhìn còn professional khi viết các function nhỏ.
Java
public void checkConditionSomething(int input) {
if (input > 10) {
return
}
// Do something like else
}
Trường hợp logic thực thi ở if và else chỉ là single (gán, so sánh, return giá trị). Cách viết chuẩn mực, gọn gàng.
Java
public boolean checkConditionSomething(int input) {
// Khỏi cần if else source vẫn đẹp như thường
return input > 10 ? true : false;
}
Cũng là một cách khác, tuy nhiên thay vì sử dụng if else với else cuối cùng, ta có thể return ngay lập tức giá trị đó.
Java
public String getStringValue(int input) {
String value = "";
// Một đoạn if else dài loằng ngoằng
if (input == 0) {
value = "Kie";
} else if (input == 1) {
value = "blog";
} else {
value = "Kieblog";
}
return value;
}
If else kiểu này thì thật sự là thảm họa. Tuy nhiên, lúc ngồi nghĩ về logic viết như thế này có thể chấp nhận được. Nhưng sau đó thì sao?.
Khi maintainance, có thể bỏ bớt else bằng cách return giá trị default.
Java
public String getStringValue(int input) {
// Không còn else, source đẹp, dễ hiểu
// Không mất công decleare variable
if (input == 0) return "Kie";
if (input == 1) return "blog";
return "Kieblog";
}
3. Bỏ if else dùng dictionary
Ngoài sử dụng if else ta còn có thể sử dụng Dictionary để thay thế cho các block if else.
Java
public String getStringValue(int input) {
String value = "";
// Một đoạn if else dài loằng ngoằng
if (input == 0) {
value = "Kie";
} else if (input == 1) {
value = "blog";
} else {
value = "Kieblog";
}
return value;
}
Có thể sử dụng Dictionary như sau:
Java
public String getStringValue(int input) {
// Dùng dictionary cũng là một cách, đẹp source ra hẳn
var operations = new Dictionary<string, Action>();
operations[0] = () => { //Do something }
operations[1] = () => { // Do something }
}
Sử dụng if else quá nhiều lần không những không làm rõ được nội dung đoạn source. Ngược lại còn làm rối tung rối mù lên. Tuy thuận tiện khi viết source logic lần đầu, nhưng nên thay đổi để bỏ bớt khi refactor source lần sau.
Viết cẩn thận chứ không em út sau đọc nó chửi sml ra.
Bài viết được sự cho phép của tác giả Nguyễn Văn Minh
Theo IIBA: Business Analyst là người kết nối giữa các bên liên quan để gợi ý, phân tích, giao tiếp và làm rõ các yêu cầu đối với các thay đổi đối với quy trình kinh doanh, chính sách và hệ thống thông tin
Nghề BA nói chung hay IT BA là một ngành nghề ngày càng phổ biến ở nước ta hiện nay. Trước đây BA chỉ thường ở các công ty làm việc tài chính, ngân hàng nhưng hiện nay thì phổ biến ở nhiều lĩnh vực. Mỗi BA thường sẽ đi sâu và làm việc chủ yếu với một domain nhất định, tuy nhiên cũng có những cách chung để tiếp cận với những domain khác nhau.
Mình xin chia sẻ những điều mà mình rút ra được trong quãng thời gian xin việc và làm IT BA trong vòng 3 năm.
Những kỹ năng cần thiết của một IT BA
1. Kỹ năng giao tiếp: BA là người phải giao tiếp trực tiếp với khách hàng để lấy yêu cầu, trao đổi dev, test để đưa ra solution tốt nhất. Vì thế người làm BA phải là một người giao tiếp tốt. Họ có thể tổ chức điều hành thành công các buổi họp, biết cách đặt vấn đề, biết lắng nghe và tiếp nhận các ý kiến trong buổi họp. Ngày nay, việc giao tiếp không phải lúc nào cũng là gặp mặt trực tiếp. Vì vậy, kỹ năng giao tiếp tốt trong các buổi họp trực tuyến cũng rất quan trọng.
2. Kỹ năng sử dụng SQL: Đây là kỹ năng quan trọng của một IT BA. Vì họ là người hiểu rõ về các bảng và cách lấy dữ liệu từ các bảng trong database.
3. Kỹ năng phân tích, phản biện: BA có trách nhiệm đánh giá, lựa chọn giải pháp trước khi làm việc với các thành viên trong nhóm. Trong quá trình xác định các vấn đề cần giải quyết của dự án, BA phải thu thập yêu cầu của khách hàng nhưng đồng thời cũng phải phân tích những yêu cầu này một cách cẩn thận và chi tiết cho đến khi BA chắc chắn hiểu được những yêu cầu, mong muốn thực sự của khách hàng. Đây là lý do tại sao kỹ năng tư duy phản biện và kỹ năng phân tích, đánh giá là rất quan trọng với một người BA mới.
5. Kỹ năng mô hình hóa vấn đề bằng biểu đồ: Phần lớn dev đều lười mở tài liệu ra đọc vì thế khi làm việc họ mong muốn có những biểu đồ rõ ràng thì sẽ đưa đến họ hơn. Một bức hình đáng giá hơn cả ngàn chữ – Các mô hình sẽ giúp người đọc dễ dàng nắm bắt ý tưởng hơn. Một vài mô hình điển hình: Use cases diagram, sequence diagram, Workflow diagrams, wireframe prototypes…. Với mỗi kĩ năng phân tích, tương ứng sẽ có một loại mô hình mà BA cần phải tạo. Đặc biệt, người làm BA nên có kĩ năng mô hình hóa lại thông tin mọi lúc, mọi nơi dù là sử dụng các mô hình chuẩn hay chỉ đơn giản là một mô hình nguệch ngoạc trên giấy.
6. Kỹ năng làm tài liệu: Khi viết tài liệu thì yêu cầu đầu tiên là viết rõ ràng và chính xác và quan trọng hơn hết là viết cho người đọc hiểu chứ không phải cho mình hiểu! Nếu bạn là một BA mới vào nghề, bạn sẽ chưa biết cách tạo ra các tài liệu đặc tả mà người làm BA phải tạo. Tuy nhiên, bạn vẫn có thể bắt đầu viết những tài liệu nếu như bạn có sẵn kĩ năng viết tốt.
Những vấn đề thường gặp khi bắt đầu đi xin việc
Đối với ngành BA thường các công ty tuyển dụng hay yêu cầu có kinh nghiệm làm việc 1 năm trở lên, tuy nhiên hiện nay cũng nhiều công ty tuyển Intern hoặc Fresher đây chính là cơ hội với người mới. Tuy nhiên, ở các công ty trong lĩnh vực IT thì mọi người hay chuyển từ dev hoặc test sang làm BA vì thế các bạn khi còn là sinh viên có thể xin thực tập dev, test ở công ty sau đó xin chuyển sang làm BA, đây cũng là một cách để tiếp cận dễ dàng hơn. Song như mình nói ở trên hiện nay thì có rất nhiều công ty tuyển Fresher hoặc Junior không yêu cầu kinh nghiệm vì thế bạn hoàn toàn có thể tự tìm hiểu và đi phỏng vấn.
Những câu hỏi thường được hỏi khi phỏng vấn
Tại sao bạn lại mong muốn chuyển sang làm BA? Trước khi chuyển sang làm BA thì mình dev vì thế lần nào đi phỏng vấn cũng nhận được câu hỏi này. Vì bản thân mình sau một thời gian làm dev thì thấy không phù hợp với nhu cầu phát triển của bản thân, khi đi học thì mình cũng thích giao tiếp với mọi người nên khi đổi ngành mình đã chọn làm BA.
Bạn hiểu BA là làm những công việc gì? Hầu hết trong trường học mọi người đều không được giới thiệu BA là gì, làm những công việc gì tuy nhiên trước khi chuyển sang công việc mới thì mọi người nên tham gia khóa học hoặc tìm hiểu thông tin trên mạng. Nội dung chi tiết BA sẽ làm những gì thì mình sẽ giới thiệu ở bài sau.
Điểm mạnh, điểm yếu của bạn khi làm BA là gì? Với mình điểm mạnh của mình là mình đã từng làm dev nên có hiểu biết cơ bản về kiến trúc của dự án công nghệ thông tin và các kỹ năng cơ bản như mô hình hóa yêu cầu, sql. Điểm yếu của mình thì nhiều khi hay đưa vấn đề của dev khi nói chuyện với khách hàng.
Một số câu hỏi liên quan đến SQL? Bạn nên nắm được một số câu lệnh SQL đơn giản như Select, Join, Group by.
Một số tình huống đơn giản và đưa ra cách giải quyết vấn đề? Ví dụ: Nếu khách hàng đưa bạn yêu cầu mới mà bạn chưa từng biết đến thì bạn phải làm thế nào?
Những công việc của một IT BA
Nhận yêu cầu từ khách hàng hoặc quản lý cấp trên, đôi khi ở các công ty làm sản phẩm thì yêu cầu sẽ đi từ đội kinh doanh hoặc từ nhu cầu thị trường
Phân tích, làm rõ yêu cầu. Đưa ra list function.
Làm các tài liệu liên quan:
Tài liệu Architecture: Tài liệu mô tả luồng thao tác người dùng, luồng hoạt động của hệ thống, cấu trúc cơ bản của hệ thống, các thành phần trong hệ thống, tương tác giữa các thành phần trong hệ thống
Tài liệu SRS hay basic design: Tài liệu mô tả chi tiết các chức năng, giao diện của từng chức năng
Tài liệu test point: Các testcase cơ bản, đặc thù liên quan đến giao diện từ phía người dùng
Thiết kế mô tả database: Database hệ thống, mô tả chức năng của các bảng các trường đặc biệt.
Transfer logic cho dev, test.
Check lại hệ thống trước khi đi đến khách hàng
Training, hướng dẫn khách hàng sử dụng hệ thống
Trên đây là khái quát các công việc của một IT BA dưới cái nhìn chủ quan của mình. Các bạn đọc có ý kiến khác vui lòng comment phía dưới. Xin cảm ơn.