Phỏng vấn trước xTalk 06/19

Q: Xin anh giới thiệu một chút về mình – như nơi công tác, công việc hiện nay, để nhiều xTer được biết đến anh đầy đủ hơn ạ?
A: Mình hiện đang là Big Data Engineer ở T-Mobile, một trong ba nhà mạng viễn thông ở Mỹ. Nhóm của mình chuyên về phân tích dữ liệu của khách hàng là các thuê bao để phục vụ cho nhóm marketing và nhóm tìm đối tác.

Q: Anh kỳ vọng sẽ mang đến những điều gì cho các bạn qua phần chia sẻ ngày mai ạ?
A: Từ fresher mới ra trường để đến được một lập trình viên có thể làm được việc trong những ngạch nhỏ / mới như Big Data là một quãng đường khá dài và lòng vòng, mình hy vọng việc nói về công việc hàng ngày thực tế của mình sẽ cho các bạn sinh viên hoặc các bạn có ý định chuyển sang ngạch BigData có một cái nhìn cụ thể hơn, có khi lại nghĩ là “Ôi tưởng sao, dễ thế ý hả” cũng nên ^.^

Q: Vì sao anh lựa chọn chia sẻ chủ đề “Công việc của một Kỹ sư Big Data”?
A: Tuần sau mình sẽ có một bài phát biểu ở Spark + AI Summit 2020, là diễn đàn lớn nhất và sôi nổi nhất về nền tảng Apache Spark và các ứng dụng của nó trong Big Data và Trí tuệ nhân tạo. Khi nhận tin là sẽ được phát biểu chính thức, mình đã nghĩ ngay đến FUNiX, là sao mình không thử chia sẻ những cái mình biết cho các bạn học viên bằng tiếng Việt để mọi người dễ tiếp cận? Và thế là nảy ra ý tưởng này.

Q: Bản thân anh đã làm công việc này lâu chưa và theo anh có những cơ hội gì cho xTer FUNiX nếu muốn theo nghề này ạ?
A: Mình đã làm được gần 4 năm, là cơm áo gạo tiền với dòng đời xô đẩy thôi ^.^ Nhưng thật sự để theo hướng BigData mà không phí phạm thời gian thì nên có định hướng từ đầu, thay vì học lan man hết ngôn ngữ này đến nền tảng khác (là cách tiếp cận của rất nhiều lập trình viên nước ta, dưới góc nhìn của mình)

Q: Học FUNiX, các bạn cần thêm những điều kiện gì để theo đuổi lĩnh vực khá hot như Big Data ạ?
A:

  • Tiếng Anh, các tài liệu về BigData bằng tiếng Việt không nhiều và ít tài liệu chính thống (sách, giáo trình, …) nên khả năng đọc được tài liệu bằng tiếng Anh là rất quan trọng.
  • Học SQL, là nền tảng của Data, rất nhiều vấn đề có thể được giải quyết chỉ bằng SQL.
  • Học Python, là ngôn ngữ của giới chuyên gia về dữ liệu, rất nhiều thư viện hỗ trợ và quan trọng hơn hết là nó rất đơn giản để bắt đầu.
  • Học Apache Spark, là nền tảng của các chương trình xử lý dữ liệu lớn cũng như trí tuệ nhân tạo. (Nói thêm là mình cũng đang trong quá trình thử dịch một quyển sách về Apache Spark cho người mới học, hy vọng đóng góp được gì đó cho cộng đồng)
  • Nếu được thì nên đầu tư chút thời gian vào môn toán thống kê (statistics) để có chút kiến thức về dữ liệu, giúp ích khá nhiều sau này.

Q: Anh là xTer đầu tiên nhận bằng FUNiX. Sau khi có bằng, công việc của anh đã có sự thay đổi ra sao ạ?
A: Không thực sự thay đổi nhiều lắm trong công việc, nhưng nó giúp mình có sự tự tin về mặt giấy tờ thủ tục hành chính. Việc này đặc biệt quan trọng với những người có ý định xin việc hay định cư ở nước ngoài. Luật ở các quốc gia minh biết (Mỹ, Úc, NZ, Canada, Nhật, …) đều yêu cầu có bằng cấp nếu muốn  được cấp thị thực làm việc (liên quan đến công việc lập trình).

Q: Là một người đi trước, với cách học FUNiX, anh có chia sẻ gì giúp các bạn học hiệu quả để gặt hái được những thành công như anh ạ?
A: Thành công thì hơi quá ^^.Tin vui là học ở FUNiX cho bạn quyền kiểm soát thời gian và tốc độ học, cũng như có hệ thống hỗ trợ khá tốt. Nhưng tin buồn là cũng như tất cả startup khác, FUNiX cũng đang phải tự hoàn thiện mình về nhiều mặt. Tuy nhiên học viên hoàn toàn có thể tự khắc phục (với sự hỗ trợ tốt như trên) bằng cách tìm hiểu thêm các nguồn tài liệu từ bên ngoài, vô cùng đa dạng và phong phú. Thêm chút thời gian và tâm huyết, mình hy vọng các bạn sẽ đạt được hiệu quả mong muốn.

Bluezone có thực sự minh bạch code của mình?

Tôi dù không phải chuyên gia bảo mật, cũng không phải chuyên gia mobile apps, càng không phải chuyên gia mảng truy vấn dấu vết, tôi chỉ là người theo dõi những diễn biến xung quanh việc release Bluezone, mở mã nguồn, …

Một trong những tiêu chí của Bluezone là “Minh bạch”, minh chứng bằng việc mở mã nguồn ở https://github.com/BluezoneGlobal. Tinh thần này về bản chất rất đáng hoan nghênh.

Hình ảnh được chụp từ website bluezone.vn
(Chụp lúc 9h50′ sáng ngày 05/09/2020 giờ Seattle, Mỹ)

Tuy nhiên, từ thời điểm công bố mã nguồn (vào tầm ngày 26/04/2020), không có mấy hoạt động diễn ra trên những repo của tài khoản này:

Hình ảnh chụp từ repo bluezone-app, nơi chứa code cho các ứng dụng trên Android và iOS
(Chụp lúc 9h55′ sáng ngày 05/09/2020 giờ Seattle, Mỹ)

Hình ảnh chụp từ repo bluezone-scan, nơi chứa code cho thư viện chung (rất quan trọng) trong việc scan các thiết bị Bluetooth. Đây cũng là nơi có nhiều tranh luận nhất về tính bảo mật và riêng tư của Bluezone.
(Chụp lúc 10h05′ sáng ngày 05/09/2020 giờ Seattle, Mỹ)

Nhưng mặt khác, Bluezone trên Google Play và trên App Store lại diễn ra vô cùng tích cực với các bản cập nhật được tung ra liên tục, khoảng 3 – 5 ngày một lần:

Quá trình release của Bluezone trên App Store cho các thiết bị iOS
(Chụp lúc 10h10′ sáng ngày 05/09/2020 giờ Seattle, Mỹ)

Thông tin về bản nhật mới nhất của Bluezone trên Google Store cho các thiết bị Android. Mặc dù không có lịch sử rõ ràng nhưng so sánh release note này với lịch sử cập nhật của App Store bên trên ta có thể giả định thời điếm cập nhật cho hai tảng này là như nhau.
(Chụp lúc 10h10′ sáng ngày 05/09/2020 giờ Seattle, Mỹ)

Một điều có thể thấy rất rõ ràng ở đây (mà không cần tải mã nguồn về và so sánh) là mã nguồn trên GitHub và các bản cập nhật của Bluezone không giống nhau. Hay nói cách khác, mã nguồn trên GitHub có thể chỉ là một bản sao của mã nguồn gốc được lưu trữ ở chỗ khác. Nếu điều này đúng là sự thật thì việc mở mã nguồn chỉ là một thủ tục và không có tác dụng như Bluezone nói.

Setup your own PaaS platform with Flynn on AWS

If you, by accident, fell in love with Heroku but cannot afford that lovely PaaS platform, then there is one alternative for you: Flynn.

Prepare AWS clusters

Flynn only works on Ubuntu 16.04 and 14.04
Let’s stick with free tier for now
Make sure you select 3 or more instances
Maximize disk with free tier, since Flynn would need quite a lot of disk space later
Mark these new instances for Flynn
Make sure both inbound and outbound rules are open for all traffic (to simplify the process)
Wrap it up
All done

Prepare Domain DNS

Map all AWS IP addresses with a (sub)domain via a single A record, in this case is app.domain.com

Install and configure Flynn

We have 3 nodes 18.223.112.52 (1), 18.223.124.4 (2), 18.224.213.225 (3). Among those 3, we need to pick one as a start node, I pick (1) in this case, it doesn’t matter at all.

# All 3 nodes
# Install 2G swap because free tier has only 1G memory per node which is way too small.
sudo dd if=/dev/zero of=/var/swapfile bs=1M count=2048
sudo chmod 600 /var/swapfile
sudo mkswap /var/swapfile
echo /var/swapfile none swap defaults 0 0 | sudo tee -a /etc/fstab
sudo swapon -a
# All 3 nodes
# Install Flynn
sudo bash < <(curl -fsSL https://dl.flynn.io/install-flynn)
# Only (1)
# Start a discover network for Flynn
sudo flynn-host init --init-discovery

# The output is something like this 
# https://discovery.flynn.io/clusters/09e7fdc4-36b3-4570-8c85-7dae8d0214d3
# Only (2) and (3)
# Connect the other nodes to Flynn discover network
sudo flynn-host init --discovery "https://discovery.flynn.io/clusters/09e7fdc4-36b3-4570-8c85-7dae8d0214d3"
# All 3 nodes
# Start Flynn service and check
sudo systemctl start flynn-host
sudo systemctl status flynn-host
# Only (1)
# Bootstrap Flynn completely
sudo CLUSTER_DOMAIN=app.domain.com flynn-host bootstrap --min-hosts 3 --discovery "https://discovery.flynn.io/clusters/09e7fdc4-36b3-4570-8c85-7dae8d0214d3"

# The output is something like this 
# 19:13:14.694228 check online-hosts
# 19:13:14.972591 require-env require-env
# 19:13:14.972697 resource-check resource-check
# 19:13:14.974356 run-app discoverd
# 19:13:15.836601 run-app flannel
# 19:13:16.310663 wait-hosts wait-hosts
# 19:13:18.823280 gen-random pg-password
# 19:13:18.823321 gen-random pg-password 4f314f651b8a0dec7d9d006837cb7401
# 19:13:18.823325 run-app postgres
# 19:13:19.904673 gen-random controller-key
# 19:13:19.904754 gen-random controller-key 995573d813b02540237682d62adb4674
# 19:13:19.904758 gen-random bootstrap-id
# 19:13:19.904776 gen-random bootstrap-id 5a83c7f4-0523-44c4-8628-f44e4b00533c
# 19:13:19.904778 gen-random dashboard-session-secret
# 19:13:19.904797 gen-random dashboard-session-secret 50161b5c1df3f57a5b1d6270e2d004dd
# 19:13:19.904800 gen-random dashboard-login-token
# 19:13:19.904814 gen-random dashboard-login-token dbc908d02187302c722e689ba9dec045
# 19:13:19.904817 gen-random name-seed
# 19:13:19.904830 gen-random name-seed ff06e10bf3626a4ee38c
# 19:13:19.904833 gen-random router-sticky-key
# 19:13:19.904847 gen-random router-sticky-key L47SR9RFb6DSdx5cbJvGq2P7WUakiyPvw+lb9YTX5Bk=
# 19:13:19.904850 wait postgres-wait
# 19:13:23.916243 gen-tls-cert controller-cert
# 19:13:24.890119 gen-tls-cert controller-cert pin: r0jVc/eHMfwiQiuzgcS7pWSvlvugv59F9DS0OemCl50=
# 19:13:24.890278 run-app controller
# 19:13:26.132221 wait controller-wait
# 19:13:27.168155 add-app controller-inception
# 19:13:27.283960 add-app postgres-app
# 19:13:27.318831 add-app flannel-app
# 19:13:27.353704 add-app discoverd-app
# 19:13:27.388183 scale-app scheduler-scale
# 19:13:27.398182 run-app scheduler
# 19:13:28.110145 create-artifact slugbuilder-image
# 19:13:28.237730 create-artifact slugrunner-image
# 19:13:28.861974 create-artifact redis-image
# 19:13:28.909479 deploy-app redis
# 19:13:29.677007 add-provider add-redis-provider
# 19:13:29.687853 gen-random mariadb-password
# 19:13:29.687915 gen-random mariadb-password 2aacaeca89699761dc78421e9c729c14
# 19:13:29.687919 deploy-app mariadb
# 19:13:30.268651 add-provider add-mysql-provider
# 19:13:30.290202 gen-random mongodb-password
# 19:13:30.290242 gen-random mongodb-password 3469202615cada26804c81c83d5f5790
# 19:13:30.290246 deploy-app mongodb
# 19:13:30.652266 add-provider add-mongodb-provider
# 19:13:30.665027 deploy-app blobstore
# 19:13:32.248566 deploy-app router
# 19:13:33.666438 deploy-app gitreceive
# 19:13:34.166675 gen-random docker-receive-secret
# 19:13:34.166720 gen-random docker-receive-secret 81dff0c1a0c99fdf4164a79e2eb4a03c
# 19:13:34.166725 deploy-app docker-receive
# 19:13:34.468126 wait router-wait
# 19:13:34.475664 add-route gitreceive-route
# 19:13:34.496660 add-route docker-receive-route
# 19:13:34.515959 add-route controller-route
# 19:13:34.529193 wait controller-route-wait
# 19:13:35.032273 deploy-app logaggregator
# 19:13:35.304439 deploy-app taffy
# 19:13:35.346020 gen-random status-key
# 19:13:35.346078 gen-random status-key a200a5e2c7bca402b1e3db42df73d1d1
# 19:13:35.346082 deploy-app dashboard
# 19:13:35.724640 add-route dashboard-route
# 19:13:35.738518 deploy-app status
# 19:13:36.051176 add-route status-route
# 19:13:36.057352 wait redis-wait
# 19:13:36.061212 wait mariadb-wait
# 19:13:36.063471 wait mongodb-wait
# 19:13:36.065504 wait blobstore-wait
# 19:13:36.081872 wait gitreceive-wait
# 19:13:36.082830 wait docker-receive-wait
# 19:13:36.086710 status-check status-check
# 19:13:36.310786 status-check status-check all services healthy
# 19:13:36.310797 cluster-monitor cluster-monitor
# 19:13:36.328490 log log-complete
# 19:13:36.328618 log log-complete 
# 
# Flynn bootstrapping complete. Install the Flynn CLI (see https://flynn.io/docs/cli for instructions) and paste the line below into a terminal window:
# 
# flynn cluster add -p r0jVc/eHMfwiQiuzgcS7pWSvlvugv59F9DS0OemCl50= default app.domain.com 995573d813b02540237682d62adb4674
# 
# The built-in dashboard can be accessed at http://dashboard.app.domain.com and your login token is dbc908d02187302c722e689ba9dec045
# Run this from your local machine
# Install Flynn CLI
L=/usr/local/bin/flynn && curl -sSL -A "`uname -sp`" https://dl.flynn.io/cli | zcat >$L && chmod +x $L
# Configure Flynn CLI
flynn cluster add -p r0jVc/eHMfwiQiuzgcS7pWSvlvugv59F9DS0OemCl50= default app.domain.com 995573d813b02540237682d62adb4674

It’a all done, you now can access your Flynn dashboard at http://dashboard.app.domain.com. You will need to download the self-signed SSL certificate that is generated by Flynn and enable it, just follow the instruction on webpage.

Important note: The self-signed certificate is for testing purpose only.

Install SSL certificate for Flynn

You’d need to acquire a valid SSL certificate, could be free or you can buy it. Make sure you use the wildcard (sub)domain name for that certificate. In this example, I used subdomain app.domain.com, so I need to register *.app.domain.com for that certificate.

You’d need to merge ca_bundle.crt into certificate.crt. You now have only 2 files certificate.crt and private.key

# Run this from your local machine, at the directory where you stored certificate.crt and private.key
# Replace the self-signed certificate with the actual certificate for some Flynn's system apps
flynn -a dashboard route update `flynn -a dashboard route | grep -Eo 'http/[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}'` --tls-cert "certificate.crt" --tls-key "private.key"
flynn -a controller route update `flynn -a controller route | grep -Eo 'http/[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}'` --tls-cert "certificate.crt" --tls-key "private.key"
flynn -a router env set TLSCERT="$(cat certificate.crt)" TLSKEY="$(cat private.key)"

SSL certificate for FREE

Via CLI: https://letsencrypt.org/
Via web: https://www.sslforfree.com/

Notes:

  1. Wildcard domain won’t cover wildcard subdomains. E.g. you’d have to register *.app.domain.com together with *.domain.com
  2. After registering, you will have 3 different files ca_bundle.crt, certificate.crt, private.key. Usually you’d have to combine ca_bundle.crt with certificate.crt to make a single file. When concatenating them, the order doesn’t really matter, you just need to bring the entire file from one to another.
  3. Free SSL is not a silver bullet for every use cases. For instance, you won’t be able to use it with your custom domain on WordPress or Heroku. Usually, free SSL would help if you have control of the web servers or platforms.