ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC CƠNG NGHỆ THƠNG TIN
-----o0o----
BÁO CÁO THỰC TẬP
LẬP TRÌNH ỨNG DỤNG MOBILE VỚI
REACT-NATIVE
Công ty thực tập
: KMS-Technology
Người phụ trách
: Cao Thanh Long
Phan Trần Bảo Long
Thực tập sinh
: Lục Trường Phong
TP. HCM, ngày 06 tháng 06 năm 2019
LỜI MỞ ĐẦU
Với tốc độ phát triển vô cùng mạnh mẽ, các ứng dụng di động là nhân tố kích thích
sự phát triển của cơng nghệ thơng tin thế giới, cả về phần cứng và phần mềm.
Nhắc đến lập trình ứng dụng là nhắc đến những developer như bản thân em, những con
người ngày ngồi cạnh máy tính để viết từng dòng code, tối ưu từng tập dữ liệu, thiết kế hàng loạt các
tính năng với mục đích đem lại tiện lợi cho người dùng và đẩy mạnh sự phát triển của phần mềm. Thế
nhưng, quá trình để xây dựng một phần mềm thực sự là như thế nào? Từ lúc triển khai ý tưởng của một
phần mềm, cho đến bước thiết kế UX, UI, cho đến lúc đặt tay vào viết dòng code đầu tiên, rồi những
cuộc họp hàng ngày để giải quyết vấn đề của mỗi thành viên trong team, những lúc cãi nhau về một
tính năng của ứng dụng,.... Nó thực sự là một nghệ thuật trong lĩnh vực công nghệ thông tin chứ không
đơn giản như chúng ta đã từng nghĩ.
Trong thời gian thực tập tại KMS, em đã được tiếp cận và tham gia trực tiếp vàoc ác dự án thực tế,
được đóng góp vào những tính năng của dự án mà mình tham gia vể cả mặt kĩ thuật lẫn ý tưởng , đó là
những trải nghiệm hết sức thú vị và mới mẻ đối với những sinh viên năm cuối như em.
.
LỜI CẢM ƠN
Trân trọng gửi lời cảm ơn Công ty KMS-Technology đã tạo điều kiện cho em có cơ
hội được thực tập tại công ty.
Trong kỳ thực tập vừa qua nhờ sự giúp đỡ tận tình của mọi người mà em đã có cơ hội được
tiếp cận với tồn bộ quá trình xây dựng, phát triển một dự án. Tìm hiểu được quy trình và vận dụng
được khả năng của mình vào một ứng dụng di dộng thực tế với React Native và NodeJS.
Em xin gửi lời cảm ơn đến anh Long Cao và anh Long Phan và mọi người trong team Grove cũng như
đã giúp đỡ và hỗ trợ em trong quá trình thực tập, đưa ra nhiều lời khun hữu ích và hướng dẫn tận tình
trong q trình làm việc
Ngoài ra, em xin cảm ơn ThS. Phạm Thi Vương và các chị trong team HR đã hỗ trợ em
rất nhiều trong quá trình thực tập.
Cũng xin cảm ơn thầy cô trong khoa Công nghệ phần mềm đã nhiệt tình hỗ trợ, tạo điều
kiện em làm bài báo cáo này.
Lục Trường Phong
HCM, ngày 6 tháng 6 năm 2019
NHẬN XÉT CỦA KHOA
Mục lục
GIỚI THIỆU VỀ CÔNG TY
I.
NỘI DUNG NGHIÊN CỨU & TÌM HIỂU
II.
2.1.
Tìm hiểu cơng ty và thiết lập mơi trường làm việc
1
2
2
2.2.1.
Mobx
2
2.2.2.
Plugin Prettier và Eslint
3
2.2.3.
Plugin FlowType
4
III.
CHI TIẾT PROJECT GROVE-ONE
5
3.1.
Giới thiệu về dự án
5
3.2.
Quá trình làm việc
8
3.3.
Kết quả đạt được
11
IV.
CHI TIẾT PROJECT SPRYNKL
11
4.1
Giới thiệu về dự án
11
4.2
Quá trình làm việc
15
4.3
Kết quả đạt được
19
V.
TỔNG KẾT – ĐÁNH GIÁ
19
I.
GIỚI THIỆU VỀ CƠNG TY
KMS Technology là một cơng ty có cung cấp phần mềm và dịch vụ cho Mỹ có các chi nhánh lớn
đặt tại Việt Nam. Cơng ty làm việc chính với các cơng ty phần mềm khác để đẩy nhanh quá trình
phát triển và cung cấp các giải pháp phần mềm cũng như outsource cho đối tác nước ngồi một cách
đơn giản và nhanh chóng.
KMS là chữ viết tắt của Khai Minh Solutions với logo có hình trống đồng màu xanh da trời. Công
ty được thành lập từ năm 2009 với co-founder CEO là Vu Lam và co-founder Josh Lieberman. Từ đó
đến nay, cơng ty đã cung cấp thành công hàng trăm sản phẩm lớn nhỏ khác nhau cho các doanh nghiệp
để từ đó thực hiện các quy chuẩn xây dựng phần mềm một cách chuyên nghiệp và nhanh chóng hơn.
Hiện cơng ty đang có bốn văn phòng ở VN và hai văn phòng ở US, với khoảng 1400 nhân viên.
Văn phòng UpStar nơi em thực tập
1
II. NỘI DUNG NGHIÊN CỨU & TÌM HIỂU
Tìm hiểu cơng ty và thiết lập môi trường làm việc
2.1.
Thời gian: 2 ngày
• Nội dung:
-
Tham gia buổi giới thiệu về cơng ty, cách tổ chức của cơng ty, q trình thành lập và phát triển
của công ty do bên HR tổ chức
-
Phổ biến quy định làm việc tại công ty
-
Gặp mặt giới thiệu, làm quen và đi ăn trưa với các bạn trong team Dev và các team khác
-
Setup enviroment và cài đặt các phần mềm liên quan cho công việc như Android Studio , Xcode,
Visual code,..
-
Tìm hiểu cách sử dụng JIRA , Zeplin
2.2.
Nghiên cứu các công nghệ liên quan
2.2.1.
Mobx
Mobx là một thư viện hổ trợ việc quản lý State của React ( giống như Context API hay Redux) đơn
giản và dễ dàng mở rộng nhờ áp dụng TFRP ( functional reactive programming )
2
Việc sử dụng Mobx sẽ làm cho app React Native trở về giống mơ hình MVVM , mọi logic được xử lý
ở ViewModel và View chỉ phải đảm nhận việc render.
Cả React và MobX đều cung cấp một giải pháp tối ưu và duy nhất cho các vấn đề phổ biến trong phát
triển ứng dụng. React cung cấp các cơ chế để kết xuất tối ưu UI bằng cách sử dụng DOM ảo giúp giảm
việc thay đổi DOM không cần thiết . MobX cung cấp các cơ chế để đồng bộ hóa và tối ưu State của
React components nhờ việc theo dõi và cập nhật liên tục State. Đơn giản là trong Mobx , state là
mutable , bạn có thể thay đổi nó trực tiếp mà khơng cần thơng qua setState().
-
State của component sẽ được lưu trữ ở MobxClass ( tương tư viewmodel) dưới dạng các
observable variable, và các function logic cũng được viết ở đây.
-
Component khi cần sử dụng thì phải inject class vào với decorate @observer
-
Nhiều component có thể sử dụng chung một
Tài liệu tham khảo : />
2.2.2.
Plugin Prettier và Eslint
Eslint
ESLint là một chương trình mã nguồn mở, theo thuật ngữ tiếng Anh là JavaScript linting utility do
Nicholas C. Zakas viết ra vào tháng Sáu 2013. Code linting là một dạng phân tích tĩnh (static analysis)
thường được sử dụng để tìm những patterns hoặc code có vấn đề. Việc đánh giá code có vấn đề hay
khơng sẽ căn cứ vào những quy chuẩn về cách viết code đã thống nhất từ trước (trong nội bộ nhóm, nội
bộ cơng ty, hay ngành nhỏ). Hầu hết các ngôn ngữ lập trình đều có các cơng cụ code linters riêng, và
trình biên dịch của ngơn ngữ đó thường đi kèm việc linting ngay trong quá trình biên dịch.
Trong lĩnh vực lập trình máy tính, lint là một ứng dụng Unix giúp cảnh báo các vấn đề khi viết code
của ngôn cữ C. Nói rộng ra, lint hoặc linter là cơng cụ giúp phát hiện và cảnh báo các sai sót khi viết
ngơn ngữ lập trình, bao gồm cả các vấn đề liên quan đến định dạng (như dấu chấm phẩy, xuống dịng,
lùi vào đầu dịng, v.v.). Các cơng cụ này thường thực hiện phép phân tích tĩnh (static analysis) các
đoạn code.
Lợi ích :
●
Giúp ngăn ngữ một vài loại bug, bao gồm cả những loại bug đem loại rất nhiều phiền hà cho q
trình gỡ lỗi, khiến chương trình khơng chạy được.
●
Tiết kiệm thời gian của lập trình viên.
●
Giúp việc viết code ngon lành hơn.
3
●
Dễ dàng sử dụng.
Việc "linkting" code JavaScript còn giúp bạn tránh được các lỗ hổng bảo mật thông dụng (như XSS),
vấn đề liên quan đến "viết code sao cho dễ đọc dễ nhìn", v.v.
Prettier
Prettier là một cơng cụ giúp format code của bạn cho đẹp hơn. Đẹp ở đây hoàn tồn mang quan điểm chủ quan
của tác giả chương trình này (thế nên nó mới được gọi là "an opinionated code formatter"). Chương trình này sẽ
yêu cầu code của bạn phải theo một format nhất định và thống nhất, thực hiện qua q trình "parsing" và "reprinting" tồn bộ code của bạn dựa trên những quy tắc nào đó, ví dụ ngắt dòng, thêm/ bớt ngoặc tròn ngoặc
nhọn khi cần.
Lợi ích
1. Xây dựng và cưỡng chế việc sử dụng 1 định dạng code chung
2. Giúp đỡ những người mới
3. Giúp tập trung vào việc viết code thay vì mất thời gian vào ngồi căn chỉnh định dạng code
4. Dễ dàng được cộng đồng lập trình chấp nhận
5. Format lại tồn bộ source code hiện tại
6. Thể hiện đẳng cấp theo kịp thời đại
Tài liệu tham khảo : /> />
2.2.3.
Plugin FlowType
Một cách ngắn gọn nhất, ngơn ngữ statically-typed thì type của biến có thể xác
định lúc compile (trước khi chạy), ngơn ngữ dynamically-typed thì chỉ biết được
type của biến lúc run time
Như vậy với ngôn ngữ dạng statically-typed, lỗi sẽ được báo ngay khi build hoặc
trên editor khi chúng ta sử dụng type không đúng. Nhưng với những ngôn ngữ kiểu
dynamically-typed như Javascript nó sẽ khác chút. Những trường hợp quên
mất kiểu của biến như vậy rất dễ gặp trong lúc code. Việc sử dụng static type check
sẽ giúp phát hiện lỗi sớm hơn, mà phát hiện lỗi sớm hơn thì sẽ tốt hơn, right?
Flow là thư viện của Facebook, hỗ trợ tốt nhất cho React, đứng trên góc độ của
người làm sell, nếu nói chúng ta sử dụng Flow từ Facebook sẽ ngon hơn, Typescript
là superset của javascript, việc dùng Typescript cũng thay đổi khá nhiều thứ khác
4
trong project, mình cảm thấy nó tiêu tốn khá nhiều thời gian hơn trong lúc
dev, PropTypes đã ko còn được quan tâm nhiều như trước nữa từ sau khi có Flow
III. CHI TIẾT PROJECT GROVE-ONE
3.1. Giới thiệu về dự án
Grove-One là dự án mobile app thuộc nhóm dự án Grove bao gồm Grove-Enterpise ( WebApp ),
Grove-Analytics và Grove-One.
Grove là nền tảng HCM ( Human Capital Management ) mới và tiện ích để giúp các công ty quản
lý nhân viên của mình, nó khơng chỉ hỗ trợ bên HR trong hoạt động hàng ngày mà còn cải thiện trải
nghiệm của nhân viên và tăng sự gắn kết của
Mục tiêu hướng tới:
-
UX / UI ấn tượng, dễ sử dụng
-
Hiệu suất và khả năng mở rộng cao
-
Tính năng đa dạng với khả năng linh hoạt và thích ứng cho nhiều mơ hình HRM của các công
ty
5
-
Nền tảng mở HCM (hỗ trợ tích hợp với các hệ thống khác)
-
Bảo mật và quyền riêng tư
-
Khả năng phân tích kinh doanh.
Nếu Grove-Enterpise dành cho bộ phận HR cũng như bên quản lý của cơng ty thì Grove-One là ứng
dụng dành cho nhân viên để hỗ trợ họ hằng ngày với các tính năng như TimeSheet ( lịch biểu ), Leave
Management ( quản lý ngày phép ) , Directory ( Danh bạ điện thoại ) , …
6
7
3.2. Quá trình làm việc
7/1/2019 – 15/2/2019:
8
-
Training về React Native và cái công nghệ liên quan.
-
Clone Login và Emoji của app Facebook
-
Clone swipe behavior của Tinder
Issue Type
Key
Summary
Assignee Status
Untestable
GO- Login components
Phong
Task
32
Luc
Testable Sub- GO- GO-20 implement UI
Phong
task
Luc
49
Testable Sub- GO- GO-21 implement UI
Phong
task
50
Luc
Improvement
GO- [IMP][Login] Login Step2
Phong
65
Luc
GO- [Login] Login - Step 1
Phong
20
Luc
GO- [Login] Login - Step 2
Phong
21
Luc
Story
Story
Bug
GO- The error message incorrect with Phong
83
Bug
message definition
144
Closed 28/Feb/19
10:13 PM
Closed 01/Mar/19
10:07 AM
Closed 01/Mar/19
10:07 AM
Done
Phong
employee displays incorrectly in
detail employee
9
Luc
08/Mar/19
10:30 AM
Done
08/Mar/19
11:37 AM
Done
14/Mar/19
11:26 AM
Closed 14/Mar/19
Luc
GO- [Directory] The name of
Updated
1:42 PM
Done
22/Mar/19
11:07 AM
Bug
GO- [Directory] The instant
143
Bug
Improvement
Story
Improvement
Story
Luc
GO- [IMP][Login] Login Step 2
Phong
116
Luc
GO- [Directory] View Details of
Phong
Story
Employee
Done
Phong
122
Luc
GO- [Directory] Call / Message /
Phong
Email in Directory
Done
contact in Android
Phong
Done
Phong
224
Luc
GO- [Directory] Add To Contacts
Phong
80
Luc
10
22/Mar/19
1:59 PM
Done
28/Mar/19
5:50 PM
Done
28/Mar/19
5:52 PM
Done
03/Apr/19
10:27 AM
Closed 10/Apr/19
Luc
GO- Add to contact too long in IOS
22/Mar/19
11:30 AM
Luc
GO- Loss information when adding
22/Mar/19
11:16 AM
Luc
GO- [IMP][Directory] Action Item
22/Mar/19
11:16 AM
Luc
74
228
Bug
Phong
Phong
69
Bug
slack in instant message on
android
GO- [IMP][Login] Login Step 1
68
Done
Luc
GO- [Directory] Cannot redirect to
145
Story
Phong
messenger fields do not work
12:01 PM
Closed 11/Apr/19
3:35 PM
Done
11/Apr/19
3:35 PM
GO- [Directory- Offline Message]
Bug
229
Phong
Message does not disappear
when I manual reload list of
Directory
Closed 11/Apr/19
Luc
3:54 PM
3.3. Kết quả đạt được
-
Nắm vững các kiến thức nền về React Native và ngơn ngữ JavaScript
-
Có đủ kiến thức để thực hiện các mảng nâng cao trong React Native như Animation, implement
các module bằng code native (Java , Objective-C )
-
Cải thiện kĩ năng giao tiếp và sắp xếp thời gian công việc
IV. CHI TIẾT PROJECT SPRYNKL
4.1
Giới thiệu về dự án
Sprynkl là ứng dụng nằm trong nhóm Grove Project với mục đích xây dựng Team culture.
Mục tiêu chín của dự án là “Give your employees a voice”:
▪
Nhận phản hồi, góp ý nhanh chóng từ nhân viên
▪
Xố bỏ ngăn cách giữa nhân viên trong môi trường làm việc
▪
Tạo ra một môi trường làm việc cởi mở và năng động
Ứng dụng Sprynkl hoạt động với ba tiêu chí :
▪
Đơn giản: Xây dựng ứng dụng với giao diện đơn giản và dễ sử dụng để có thể dễ
dàng tiếp cận với người dùng (employee)
▪
Nhanh chóng: Tạo bảng khảo sát và đưa đến những người khác trong Team một
cách nhanh chóng. Tương tác liên tục giữa những người trong team.
▪
Trung thực: Bạn có thể gửi góp ý cho một người khác trong team dưới dạng Ẩn
danh ( Anoynimous ), danh tính của bạn sẽ được bảo mật
11
Với Sprynkl, bạn có thể tham gia một hoặc nhiều team. Lời mời có thể được chấp nhận khi
bạn đăng nhập lần đầu hoặc sau khi bạn đăng nhập. Chuyển đổi giữa tất cả các đội bằng
cách chọn vào hình đại diện của team đó.
Employee tương tác với nhau và xây dựng Team Culture của họ qua việc chia sẽ, khảo
sát,gớp ý lẫn nhau để hiểu nhau hơn. Nhằm đáp ứng cho việc này Sprynkl tạo ra ba mục
đăng khác nhau tuỳ theo nhu cầu sử dụng :
▪
Voice : Dùng cho việc đóng góp ý kiến để xây dựng Team , chia sẽ những khoảnh
khắc đẹp trong quá trình làm việc hoặc của riêng bản thân . Thành viên khác trong
nhóm cũng có thể thể hiện sự đồng ý của họ bằng cách tương tác với bài đăng của
bạn: thông qua Clap hoặc bình luận. (nơi mở để đề xuất và phản hồi)
12
-
▪
Ask: Tạo ra những khảo sát nhanh với 1 câu hỏi duy nhất. Ở đây chúng ta hướng
tới việc thực hiện những câu hỏi khảo sát nhỏ một cách ngẫu nhiên và thỉnh thoảng
hơn là việc đưa ra một bảng khảo sát lớn (> 10 câu hỏi ) mỗi tháng.Có nhiều dạng
câu hỏi khảo sát được hỗ trợ sẵn.
13
-
▪
Thanks: Khi ai đó giúp đỡ bạn , hãy gửi tới họ lời cảm ơn . Bỏ qua sự lúng túng và gửi lời
cảm ơn cho đồng nghiệp của bạn là một cách để khích lệ những nỗ lực của họ.
14
4.2
Quá trình làm việc
Issue Type
Bug
Key
SPM- [Sign up/in] Incorrect
1116
Bug
Status
Phong Luc Done
Updated
25/Apr/19
5:05 PM
Phong Luc Done
Endless loading bar when
user enters an incorrect
password
SPM- [Profile] Cannot scroll to
1174
Assignee
header color UI when
navigate to another screen
SPM- [iOS][Change Password]
1085
Bug
Summary
03/May/19
2:54 PM
Phong Luc Done
top of profile when pressing
on Profile icon
05/May/19
2:56 PM
15
Bug
SPM- [Input code] App does not
891
Bug
SPM- [Update profile] After
1181
Bug
Bug
1212
Bug
Bug
1198
Bug
Bug
Bug
Phong Luc Done
Phong Luc Done
1235
12/May/19
3:03 PM
Phong Luc Done
15/May/19
12:01 PM
Phong Luc Done
crashed/Display the red
error screen after entering
the valid email
17/May/19
1:50 PM
avatar of team changes
when tapping edit profile
button
SPM- [Invite member] Lack of
09/May/19
11:43 AM
SPM- [Edit Team Profile] Default Phong Luc Done
1246
09/May/19
10:40 AM
warning message when user
use back navigation on
android
SPM- [Invite Teammates] App
1265
Phong Luc Done
showing dropdown list
while keyboard is opened is
not good
SPM- [Android] Display a
08/May/19
11:19 AM
for Poll when switching
type
SPM- [Create ask] Animation of
1213
Phong Luc Closed
loading avatar
SPM- [Ask] Lack of empty line
06/May/19
10:27 AM
updating avatar, view
picture screen appears
SPM- [Notification] Cannot
892
Phong Luc Done
automatically switch to
next cell when inputting
same number with existing
number
17/May/19
1:52 PM
Phong Luc Done
empty line when navigating
back to Invite member
screen
17/May/19
3:23 PM
16
Bug
SPM- [Sign in/up] Incorrect UI
1118
Bug
SPM- [Ask noti] App does not
1182
Bug
1173
Bug
1188
Bug
1304
Story
Phong Luc Closed
Phong Luc Done
Phong Luc Done
Phong Luc Done
when using hashtag
suggestion in Poll and Scale
Improvement
8:49 AM
Phong Luc Done
Phong Luc On Hold
notification when the post
has more than 100
comments
SPM- [Notification] Scroll to the
787
04/Jun/19
04/Jun/19
11:25 AM
SPM- [Notification] Disappear
1110
04/Jun/19
8:28 AM
1095
Bug
29/May/19
5:32 PM
not auto refresh after
navigating from push noti
SPM- [Navigation] User flow
27/May/19
2:45 PM
are not rendered as the
same time
SPM- [Create ask] Error appears
27/May/19
11:07 AM
Missing loading bar when
avatar is uploading
SPM- [In-app noti] Noti list does
27/May/19
9:43 AM
several accounts, should
update invited by and send
new email
SPM- [Post detail] Components
1195
Bug
Phong Luc Done
auto push Someone
answered your Ask noti
SPM- [Pixel 2][Personal Profile]
17/May/19
4:04 PM
SPM- [Invite] If user is invited by Phong Luc Done
1176
Bug
Phong Luc Done
when confirm code
(Coding)
Phong Luc Testing
unread comment +
highlight when tapping to
notification
04/Jun/19
2:10 PM
11/Jun/19
11:03 AM
17
Bug
SPM- [My Profile] Avatar is not
1248
Improvement
SPM- [Avatar] Able to view
1140
Bug
1328
Improvement
13/Jun/19
4:51 PM
Phong Luc Done
13/Jun/19
6:12 PM
when tap back from Invite
screen
Phong Luc Done
17/Jun/19
3:05 PM
Phong Luc To Do
receiver is not OK
17/Jun/19
3:54 PM
Phong Luc Done
Notification list is not fixed
while scrolling on
home/team feed
SPW- [Notification] Notification
115
11:20 AM
code] Display "Wrong pin"
pop-up when input a correct
code
SPW- [View Notification]
117
Bug
Phong Luc Done
button] Re-order and
remove features.
SPM- [User flow] Flow of input
1319
Bug
4:45 PM
crashed after tapping Next
button on keyboard
SPM- [Android][Confirm your
1332
Bug
13/Jun/19
SPM- [Create team] App is frozen Phong Luc In-Process 14/Jun/19
1318
Bug
13/Jun/19
4:37 PM
app when tapping on profile
SPM- [See all members][More
1247
Bug
Phong Luc Done
profile when tapping to
avatar
SPM- [Confirm your code] App
12/Jun/19
9:19 AM
SPM- [View Profile/See All] Kill Phong Luc Done
1326
Bug
Phong Luc Done
the same as UI design
14/Jun/19
9:30 AM
Phong Luc Done
list is not responsive on
desktop 13 inch
14/Jun/19
9:54 AM
18
SPW- [Edit Team Profile] Default Phong Luc Done
Bug
138
avatar of team changes
when tapping edit profile
button
SPW- [Create a post] Don't show
Bug
146
pop-up “Are you sure to
discard” when user cancel
creating a post
SPW- [Common Behavior] The
Bug
104
4.3
14/Jun/19
4:23 PM
Phong Luc Done
20/Jun/19
10:32 AM
Phong Luc Testing
pop-up isn't closed when
click "Back" button of
browser
20/Jun/19
1:48 PM
Kết quả đạt được
-
Hiểu thêm được mô hình code khác của React Native khi sử dụng mobx
-
Học thêm được kiến thức về Web ( ReactJS ) và Back-end ( nodeJS )
-
Cải thiện được được khả năng làm việc nhóm hơn khi làm trong mơi trường team đơng người
V. TỔNG KẾT – ĐÁNH GIÁ
Sau khoảng 6 tháng thực tập ở KMS-Technology và tham gia 2 project của công ty, em có những trải
nghiệm khá vui và thú vị khi được làm việc trong một môi trường chuyên nghiệp.Trong quá trình làm
19
việc, em nhận thấy được những điểm mạnh của bản thân và những thiếu sót của mình kể cả về chun
mơn lẫn các kĩ năng mềm khác, nhờ đó mà có thể thay đổi để phát triển bản thân hơn.
20