- vừa được xem lúc

Team R&D của chúng tôi đã xây dựng các dự án thần tốc như thế nào ?

0 0 15

Người đăng: Quang Vinh

Theo Viblo Asia

Khái niệm R&D viết tắt của Research and Development có nghĩa là nghiên cứu và phát triển. Trong lĩnh vực phát triển phần mềm, đặc biệt trong mảng outsource, hầu như khi việc đến tay các bạn dev cũng gần như là công đoạn xây dựng phần mềm rồi. Các quá trình nghiên cứu và phân tích hệ thống thường được làm trước đó bởi những người có kinh nghiệm, có những cái nhìn tổng quát hơn là việc viết Code đơn thuần. Nhưng khi xây dựng các sản phẩm riêng, lúc này buộc các doanh nghiệp phải có team R&D. Quá trình một sản phẩm được hình thành dựa vào một ý tưởng nhỏ là một quá trình vô cùng phức tạp, đòi hỏi nhiều giai đoạn, nhiều người và mỗi người phải am hiểu một phần khác nhau. Trong team R&D của mình có lẽ cũng giống như hầu hết các dự án phần mềm khác nhưng cũng có các đặc thù riêng. Trong bài viết này mình sẽ nói cả cách vận hành, các công nghệ sử dụng để có thể xây dựng các dự án vừa nhanh, vừa chất lượng, và vừa bảo mật.

Nuôi quân 3 năm, dụng 1 giờ

Trong một doanh nghiệp dù to dù bé, tùy vào quy mô thì cũng có đâu đó trên đầu ngón tay số lượng dự án nghiên cứu và đưa vào phát triển chưa nói đến việc triển khai đến tay người dùng. Quay đi quay lại là hết 12 tháng của một năm có khi còn chưa ra được phiên bản beta nào. Nếu phát triển quá nhiều thì không trọng tâm. Nếu phát triển quá nhanh thì không đảm bảo được chất lượng. Nếu muốn làm nhanh thì phải nghiên cứu lâu. Nhưng nếu làm lâu thì ảnh hưởng đến cả doanh nghiệp. Thế câu chuyện là làm sao để cân bằng được những vẫn đề trên ?

Để trả lời cho câu hỏi trên, mình sẽ đưa ra hai vấn đề trọng tâm. Đó là muốn nghiên cứu nhanh thì phải có kiến thức nền tảng, muốn phát triển phần mềm nhanh thì phải làm chủ được công nghệ. Team R&D tại 5LABS chủ yếu nghiên cứu và phát triển các giải pháp an toàn thông tin, hệ thống phân tích xử lý các vấn đề an toàn thông tin, thu thập dữ liệu và cảnh báo v.v. Vậy nên đa số các thành viên trong team đều có kiến thức nền tảng về bảo mật đi kèm theo kiến thức lập trình. Điều quan trọng nhất khi muốn xây dựng một hệ thống mới là phải đi tìm hiểu xem đã có hệ thống tương tự chưa, hạn chế tối đa việc bỏ thời gian ra để nghiên cứu một thứ đã chạy rất tối rồi, điều ấy chẳng khác nào chúng ta đi thiết kế lại một chiếc bánh xe cả. Dựa vào độ phức tạp của dự án cũng như số tiền phải bỏ ra để mua phần mềm đã có sẵn, chúng ta sẽ cân đối giữa việc phân tích xem các phần mềm đó có các chức năng gì và họ đã phát triển như thế nào, liệu có thể làm lại một cái mới mà rẻ hơn không. Điều này không phải là xấu. Đó là điều mà bất kỳ công ty công nghệ nào cũng đã từng làm, và cái chúng ta nhìn thấy rõ nhất là Trung Quốc. Họ làm những thứ thậm chí là tốt hơn bản gốc nhưng giá thành lại rẻ hơn, không có nghĩa là sản phẩm của họ không chất lượng mà nó nằm ở tính cạnh tranh về chi phí cho cả team và rộng hơn là cả doanh nghiệp. Trích dẫn một câu nói nổi tiếng của Abraham Lincoln: “Nếu cho tôi 6 giờ để chặt một cái cây, tôi sẽ dành 4 tiếng để mài rìu”.

Để quá trình phát triển (Development) diễn ra nhanh chóng, phải đảm bảo các yêu cầu dự án rõ ràng, thiết kế giao diện cụ thể dựa trên phân tích nghiệp vụ, giữa dev và tester phải có tiếng nói chung, phải có test case cụ thể nhằm khi tất cả cùng chạy thì không dẫm lên chân nhau. Một trong những vấn đề chính xảy ra dẫn đến việc chậm dự án có thể là do phân tích nghiệp vụ chưa kỹ, thay đổi chức năng khi đang phát triển, không kiểm soát được lỗi, không làm chủ được công nghệ, hoặc là dev không hiểu rõ những việc mình đang làm. Giải quyết các vấn đề này triệt để ở đầu dự án sớm bao nhiêu thì tốt bấy nhiêu. Như vậy buộc team phải có những cuộc họp dự án để thống nhất giữa mọi người. Và khi mọi người đảm bảo rằng bản thân mình đã nhận thức được việc mình đang và sẽ làm thì mọi người phải chịu trách nhiệm rõ ràng về những việc đó.

Có hệ thống làm việc chung tất cả trong một

Nếu ở quy mô 3 người, bạn không cần làm điều thừa thãi này, nhưng ở một quy mô lớn hơn, hãy xem xét sử dụng các phần mềm quản lý công việc kiểu như Jira, Trello, Asana, Larksuite. Hãy nhớ rằng, người quản lý chỉ quan tâm bạn có làm được không và làm trong bao lâu. Vậy nên hãy đưa ra những minh chứng cụ thể những việc chúng ta đã làm thông qua các phần mềm này. Đó là lợi ích dành cho cả người lao động và người sử dụng lao động. Nó tạo ra một cảm giác làm việc chuyên nghiệp hơn là một đồ án môn học của bạn thời đại học. Nơi mà bạn hoặc một ai đó trong team phải làm hết tất cả các việc còn những thành viên khác thì ngồi chơi.

Chúng tôi đã sử dụng những công nghệ gì ?

Trừ khi có những dự án đặc biệt cần những công nghệ, framework cụ thể. Còn không, hãy xây dựng một tech stack riêng cho team theo một chuẩn chung để đảm bảo người mới vào cũng có thể nhanh chóng hòa nhập với cả team. Team 5LABS đã mất 2 năm để xây dựng ra các lộ trình phát triển phần mềm, cùng với cả stack công nghệ phù hợp với thế giới hiện nay. Qua các dự án cụ thể, từ khi còn sơ khai, thử nghiệm, và đưa ra các sự lựa chọn, cuối cùng team cũng đã thống nhất dùng chung một ngôn ngữ đó là JS, sau này là TS (Typescript)

1. Backend

5LABS sử dụng NodeJS để phát triển hệ thống backend của mình. Đối với các dự án lớn, cần sự ràng buộc về kiến trúc dự án, chúng tôi sử dụng framework NestJS. Tại sao lại là NestJs mà không phải ExpressJS ? Về bản chất thì NestJs cũng dựng lên từ Express, nhưng NestJS nó đã sinh ra các tiêu chuẩn không thể thay đổi mà ai học nó, làm nó đều phải tuân theo như một luật lệ ngầm. Ngoài ra NestJs cũng cung cấp rất nhiều Module có sẵn như Database, Caching, Rate Limit, Decorator, Guard. Nếu như chúng ta làm hết những thứ này bằng tay với Express thì sẽ tốn rất nhiều thời gian. https://nestjs.com/

  • Sử dụng các thư viện CRUD generator để tạo ra các API tương tác dữ liệu cơ bản nhưng phải bảo mật, dưới đây là code ví dụ:
@ApiTags('users')
@Controller('users')
@UseGuards(JwtAuthGuard)
@Crud({ model: { type: UserEntity, }, dto: { update: UpdateUserDto, create: CreateUserDto, }, query: { limit: 100, cache: 200, exclude: ['password'], }, routes: { only: ['getManyBase', 'getOneBase', 'createOneBase', 'updateOneBase', 'deleteOneBase'], createOneBase: { decorators: [Roles([ADMIN]), UsePipes(validation)], }, getManyBase: { decorators: [Roles([ADMIN])], }, getOneBase: { decorators: [Roles([ADMIN, USER])], }, updateOneBase: { decorators: [Roles([ADMIN]), UsePipes(validation)], }, deleteOneBase: { decorators: [Roles([ADMIN])], }, }, params: { id: { type: 'uuid', primary: true, field: 'id', }, },
})
  • Đoạn code này có thể tạo ra các api đã khai báo routers.only, các phân quyền của các api là mảng của decorators: [Roles([ADMIN, USER])] cùng với các tham số khác như Guard, DTO, Entity ta đã có một bộ api quản lý user hoàn chỉnh bao gồm cả paging, filter, query. Tất nhiên trên này là các api được tạo ra từ thư viện, bản thân dev backend phải tự code ra các đoạn code xử lý riêng các nghiệp vụ của dự án. Nhưng ít nhiều cũng đã giảm tải được phần lớn thời gian https://github.com/nestjsx/crud

2. Admin

  • Đa phần phía backend các hệ thống của 5LABS đều có trang quản trị đi kèm. Theo quan điểm của mình, trang quản trị là nơi phản ánh chính xác nhất các nghiệp vụ của hệ thống backend dưới góc độ của người quản trị. Ở đây bọn mình sử dụng react-admin để xây dựng
import React from 'react';
import { Admin, Resource, ListGuesser } from 'react-admin';
import simpleRestProvider from 'ra-data-simple-rest'; const dataProvider = simpleRestProvider('https://example.com/api'); const App = () => ( <Admin dataProvider={dataProvider}> <Resource name="users" list={ListGuesser} /> </Admin>
); export default App;
  • react-admin cung cấp một giao diện thân thiện dựa trên MUI của Google. Có sẵn nhiều component để linh hoạt sử dụng như hiển thị bảng, thêm, xóa, sửa, hiển thị, phân quyền, và có thể tùy chỉnh mọi chức năng cũng như giao diện nhanh chóng

https://marmelab.com/react-admin/

3. Frontend và mobile

5LABS sử dụng framework NextJS để phát triển các website. Next cũng như Nest, cũng có sẵn nhiều hàm và đặc biệt là có tiêu chuẩn kiến trúc thư mục chung, và tất cả mọi người phải code theo nó. Điểm mạnh của NextJS là nó có thể viết bằng React và SEO được, các phiên bản gần đây mang lại rất nhiều cải tiến về hiệu năng và trải nghiệm tải trang mượt mà. Có thể nói đến thời điểm hiện tại, Next vẫn có vị thế đi đầu trong lĩnh vực lập trình web và hoàn toàn có thể so sánh Nuxt hay Angular.

Về mặt mobile, react-native luôn là sự lựa chọn tuyệt vời nếu bạn đã code thành thạo react. Nếu code những thứ như native như Kotlin cho Android hay Swift cho IOS thì react native có thể xử lý cả 2 và không cần thuê thêm nhân công chỉ để code mobile khi team đã có đội dev frontend web mạnh. Tất nhiên mỗi ngôn ngữ hay thư viện nó cũng mang lại hiệu suất về công việc hoặc hiệu suất về ứng dụng khác nhau, mọi thứ sinh ra đều có mục đích riêng của nó cả. Tuy nhiên 5LABS vẫn chọn react-native cho hầu hết cả dự án gần đây và nó mang lại các kết quả tuyệt vời.

  • Điều thú vị ở đây là 5LABS sử dụng TailwindCSS để xây dựng giao diện cho cả website và mobile. Thay vì phải viết từng dòng CSS tốn rất nhiều thời gian, chưa kể phải responsive cho từng kích cỡ màn hình, TailwindCSS là chiến thần trên mọi mặt trận để biến đổi một bản thiết kế của designer thành một giao diện phần mềm chỉ trong một nốt nhạc. Điều kiện cần là nhớ và áp dụng được các tên class, điều kiện đủ là chỉ cần nhìn vào thiết kế phải hình dung ra được cần phải code như thế nào sau 5 giây 😃 https://tailwindcss.com/

  • Còn đây là code tailwindCSS trên react-native sử dụng twrnc

import tw from './lib/tailwind'; // or, if no custom config: `from 'twrnc'`
import { useDeviceContext } from 'twrnc'; export default function App() { useDeviceContext(tw); return ( <View style={tw`bg-white dark:bg-black`}> <Text style={tw`text-black dark:text-white`}>Hello</Text> </View> );
}

https://www.npmjs.com/package/twrnc

Ngoài ra:

  • Các thành viên trong team buộc phải theo các quy luật như khai báo biến, khai báo hàm, khai báo component, interface, type, enum, call api.
  • Sử dụng redux cho các dự án để tạo ra các ràng buộc chung trong quản lý state của ứng dụng.
  • Tạo ra các component chung để có thể tái sự dụng trong dự án, các dự án khác ví dụ như (Button, Input, Loading, Menu, Select ...)

Rút kinh nghiệm từ các dự án đã làm

5LABS đã hình thành văn hóa tạo ra các project base template chung để các dự án sau chỉ cần clone về là đã có sẵn những thứ cần sắp xếp ở đó và sẵn sàng cho dự án mới. Các project base sẽ luôn được cập nhật tinh chỉnh theo thời gian qua các kinh nghiệm được tích lũy. Nhưng nếu lạm dụng việc này, rất có thể các thành viên trong team sẽ bị lười hiểu những thứ cơ bản nhất của dự án. Điều này cũng cần có những buổi seminar giới thiệu về công nghệ thường xuyên hơn. Tránh trường hợp làm việc một cách mơ hồ, làm những không hiểu bản chất.

Nhanh nhưng phải bảo mật

Ngoài tester để kiểm tra các chức năng đã chạy đúng hay chưa, 5LABS có team pentest về bảo mật để đảm bảo về an toàn thông tin của hệ thống theo nhiều tiêu chuẩn khắt khe. Điều đó cũng đòi hỏi các dev phải luôn tuân thủ các quy trình code bảo mật

  • Kiểm tra phân quyền
  • Kiểm tra tính khả dụng của token
  • Kiểm tra đầu vào dữ liệu
  • Không trả thừa dữ liệu
  • Không trả về dữ liệu nhạy cảm
  • Mã hoá các dữ liệu nhạy cảm
  • Không sử dụng row query để query database nếu không cần thiết
  • Xây dựng backend luôn có phần lưu log đăng nhập
  • Tracking Ip address, user-agent, fingerprint
  • Cấp token thời gian ngắn
  • Có chức năng refresh token
  • Không cho cập nhật trực tiếp các trường nhạy cảm như password, secretKey, refreshToken, expiredAt...
  • Không cài thừa thư viện
  • Không cài thư viện không uy tín, nhiều lỗi, nhiều lỗ hổng bảo mật

Kết luận

Tùy vào quy mô nhân sự và quy mô các dự án mà có cách vận hành khác nhau. Bản thân mình thấy team mình nhiều điểm vẫn hoạt động chưa hiệu quả, nhưng vẫn có khả năng sẽ cải thiện được thêm. Đó là tất cả những gì của bài viết. Cảm ơn và hẹn gặp lại trong các bài viết tiếp theo trên Viblo!

Bình luận

Bài viết tương tự

- vừa được xem lúc

Full Stack Developer Roadmap 2021

Cách để trở thành một Full Stack Web Developer trên thế giới hiện nay. Các công ty đang luôn săn đón những developer có nhiều kĩ năng để cung cấp cho họ sự linh hoạt trong các dự án.

0 0 25

- vừa được xem lúc

Làm gì khi website truy cập chậm? Câu trả lời tưởng dễ, nhưng thật ra không hề dễ.

Làm gì khi website truy cập chậm? Câu trả lời tưởng dễ, nhưng thật ra không hề dễ. Hãy tưởng tượng, chúng ta là thầy thuốc, trang web là bệnh nhân và bệnh nhân này có triệu chứng truy cập chậm.

0 0 45

- vừa được xem lúc

26 tuổi thất nghiệp và hành trình chuyển ngành lập trình từ con số 0

Chuyển ngành CNTT ở tuổi không còn trẻ, áp lực từ sự kỳ vọng của gia đình, từ bạn bè cùng trang lứa, từ các bạn trẻ đã có nền tảng lập trình tốt, mình buộc bản thân phải thành công sớm. Đó là những gì

0 0 57

- vừa được xem lúc

Làm sao để trở thành Web Developer từ Embedded Engineering

Tôi đã trở thành fullstack web/app engineer từ một embedded engineer như thế nào. . . .

0 0 19

- vừa được xem lúc

How To Make Full Stack Kanban App | React Node MongoDB Material-UI | Full Stack Developer Course

In this video, we are going to make full stack Kanban website. We will use ReactJS, NodeJS, MongoDB and more. Hope this video useful to you. .

0 0 51

- vừa được xem lúc

Text Reveal On Mouse Move HTML CSS JS

In this video, we are going to make Text reveal effect when mouse hover. Hope this video useful to you. . SUBSCRIBE for more AWESOME videos.

0 0 26