Trường học vs Công sở – đôi bạn thân ít ai ngờ tới

Khi còn đi học ở trường đại học chúng ta chỉ muốn nhanh chóng ra trường để đi làm mà mấy ai biết khi đi làm thì chỉ muốn quay về trường học lại.

Đùa với các bạn thế thôi, mình còn một cái khóa luận tốt nghiệp to đùng với 1 môn học thiết kế phần mềm giáo dục nữa còn ở công ty thì tính tới bây giờ mình đã làm được 8 tháng rồi đấy. Nhân hôm nay vừa làm xong cái yêu cầu của khóa luận tốt nghiệp lên tâm sự với mọi người dù biết rằng chắc chẳng có ai vào cái blog mà mình không quảng cáo cũng không cho ai biết này đâu.

Trường học và công ty tuy hai mà một, một bên cung cấp kiến thức mang nặng tính lý thuyết, học thuật, một bên lại yêu cầu luyện tập thực hành hàng ngày, đánh giá dự án thực tế để nâng cao bản thân. Mình thấy nhiều bạn ái ngại việc đi thực tập hoặc đi làm part-time tại một công ty trong thời gian còn học ở trường vì một số lý do sau:
+ Sợ bỏ bê việc học không đạt được điểm số như mong muốn
+ Không cân bằng được việc quản lý thời gian vì ở công ty khi đã làm chính thức đòi hỏi việc estimate thời gian theo task, theo dự án chính xác từ giờ phút đấy nhé
+ Sợ kiến thức học được ở trường không áp dụng vào vì suy nghĩ kiểu gì vào người ta cũng train lại từ đầu thì thôi học cho xong rồi đi làm luôn.

Vân vân và vân vân ý kiến nhằm phủ định mong muốn đi thực tập hoặc đi làm của bản thân. Điều này làm mất khá nhiều thời gian của các bạn đấy vì như mình dân kỹ thuật đã phần nếu không ở trường thì ở nhà cũng phải tìm hiểu công nghệ, làm dự án cá nhân thì mới lên trình được vậy tại sao thời gian ở nhà đó chúng ta lại không thử sức trong một môi trường mới năng động hơn là ở nhà đó là công ty. Mình có thể đưa ra một số lý do bên dưới:
+ Đi làm công ty được train, học những kiến thức rất rất thực tế
+ Giao tiếp được với mọi người các anh chị được mọi người truyền lại kinh nghiệm
+ Làm dự án thực tế cũng như một dự án cá nhân nhưng sẽ có team và có support thay vì ở nhà cặm cụi tự tìm kiếm, fix bug thì môi trường công ty sẽ giúp ta hướng giải quyết vấn đề và teamwork chuyên nghiệp trong một dự án
+ Học được quy trình làm việc mà từ đó có thể áp dụng vào trường học ngược lại

Nhưng các bạn đừng lo kiến thức ở trường không phải là vô dụng đâu

Chúng ta học được các kiến thức căn bản lập trình nè, hướng đối tượng, hướng hàm từ đó có cái nhìn tổng quan và dễ nắm bắt một ngôn ngữ lập trình. Tiếp theo đó mình sẽ liệt kê một số điều tuyệt vời mà trường học trang bị giúp chúng ta tham gia vào các công ty:
+ Kỹ năng trang bị đối phó trong các đợt đăng ký môn học giúp ta phản ứng nhanh với các tình huống bất ngờ như khách hàng thay đổi requirement chẳng hạn :v
+ Kỹ năng làm việc nhóm ở trường đại học cũng là một bước tiến cho bạn làm việc nhóm tại các công ty nơi các bạn đóng góp ý kiến và chia sẻ kiến thức của mình với mọi người
+ Kỹ năng tìm kiếm ở trường như phải tìm kiếm tài liệu, nguồn tiếng Anh giúp chúng ta có kinh nghiệm hơn trong việc giải quyết vấn đề “first” bởi vì chúng ta phải tự tìm hiểu trước mới hỏi đến mentor hoặc giáo viên điều đó giúp cho làm việc ở công ty cũng theo tuần tự như vậy. Phải tự research trên medium, stackoverflow, viblo,… nếu bí quá thì mới hỏi anh leader, anh senior giúp mình 😀

Áp dụng kiến thức từ công ty vào ngược lại trường học, tại sao không?

Hiện tại mình đang áp dụng quy trình làm việc mà mình học tập ở công ty vào khóa luận tốt nghiệp của mình:
+ Phân tích yêu cầu của ứng dụng, đánh giá thực trạng của chủ đề nhóm đang làm
+ Ước lượng thời gian cho các yêu cầu, cần phải high level cho các module của ứng dụng
+ Sau khi đã có bản ướ lượng ta áp dụng ngay vào cho Đề cương chi tiết khóa luận một cái nhà trường yêu cầu phải có nhưng bây giờ ta có bản estimate thời gian rồi thì chỉ cần việc áp vào rất nhanh
+ Tiếp theo phân tích cơ sở dữ liệu theo mô hình SQL hoặc NoSQL cho việc hỗ trợ tốt đa các chức năng ví dụ là Full-text search chẳng hạn
+ Khi mọi thứ đã ổn định như vậy thì ta tiến hành code theo các module khi đó thời gian ta làm việc sẽ nhanh chóng và chuyên nghiệp đảm bảo đúng theo lộ trình giao viên hướng dẫn đề ra
+ Áp dụng các công nghệ quản lý như Trello, Skype, TortoiseGit để quản lý task, mã nguồn và liên lạc giữa các thành viên nhóm
+ Cuối cùng là các kỹ năng test và viết document được học hỏi từ các anh chị bên team Test giúp cho chúng ta hoàn thành báo cáo và kiểm thử lại dự án chuyên nghiệp nhất có thể.

Trên đây là một số chia sẻ của mình giữa trường học và công ty, giữa việc học và việc đi làm. Nó bổ sung kinh nghiệm, kiến thức cho nhau chứ không loại trừ lân nhau nên nếu có thể hãy đắm mình trong sự hối hả của cả 2 để thấy được chúng ta mạnh mẽ đến thế nào như mình chẳng hạn Ahihi

Advertisements

Comeback…. Welcome to my blog!

Chào mọi người rất xin lỗi vì quãng thời gian qua mình phải làm tiểu luận chuyên ngành nên không có nhiều thời gian chăm chút cho blog để như nhà hoang ý rất có lỗi luôn.

Giờ mình bắt đầu kì 2 năm cuối rồi chuẩn bị cho khóa luận tốt nghiệp nhưng trong khoảng thời gian này mình khá rảnh nên tiếp tục viết các bài chia sẻ với blog. Dự định sắp tới của mình là tập trung khá nhiều vào Front-end vì ở công ty mình cũng đang làm Front-end nhiều. Tiểu luận chuyên ngành mình tập trung học Angular 6 và set-up một project Angular 6 nên cũng khá thú vị. Bây giờ ở công ty mình làm về Vue.JS một bé nhưng có võ trong thời gian gần đây. Nếu có thời gian mình sẽ chia sẻ nhiều về nó. Bên cạnh đó mình muốn học tiếng Nhật và tiếng Hàn (sở thích coi show của mình 😀 ) sau đó là học guitar cua gái ahihi

Rất mong mọi người tiếp tục quan tâm tới blog và dành nhiều sự quan tâm về các bài viết mình chia sẻ cảm ơn mọi người nhiều nha thả tim ❤ ❤ ❤

Hệ thống nhúng – Giao tiếp chuột và bàn phím sử dụng Kit STM32F429-DISCOVERY

Mình đang làm báo cáo đè tài này nên tiện đây chia sẻ cho mọi người báo cáo kết thúc môn học của mình luôn. Đề tài giao tiếp chuột và bán phím với Kit. Ở đây mình sử dụng Kit STM32F429-DISCOVERY. Vì đây mình chỉ upload thôi nếu mọi người có thắc mắc gì có thể comment hoặc nhắn tin cho mình nha, blog mình không đi sâu vào nhúng nên bài này mình sẽ không đi quá sâu.


Sơ lược về vi xử lý: 

  • STM32F429ZIT6 có bộ nhớ Flash 2MB được tổ chức 2 banks cho phép đọc ghi song song, 256 KB RAM(LQFP144)
  • Bộ nhớ ngoài linh động với 32 bit bus dữ liệu: hỗ trợ bộ nhớ SRAM, PSRAM, SDRAM, Compact Flash/NOR/NAND
  • On-board ST-LINK/V2 với lựa chọn chế độ chuyển đổi giữa debug và chạy mạch.
  • ST-LINK/V2 ( có kết nối SWD để lập trình và gỡ lỗi) giúp cho việc nạp code vào mạch diễnra nhanh chóng hơn từ việc code từ Keil uVision và đưa qua ST-Link Utility và nạpcode vào mạch.
  • Nguồn cấp cho Board kit là qua USB hoặc từ nguồn điện bên ngoài 3V or 5V tiện lợi vìcó thể chuyển đổi từ cổng USB trên máy tính để cấp nguồn cho mạch.
  • Màn hình TFT LCD QVGA 2.4”: Bộ điều khiển LCD-TFT có độ phân giải lên tới VGA với Bộtăng tốc Chrom-ART chuyên dụng để tạo nội dung đồ họa nâng cao (DMA2D)
  • Bộ cảm biến chuyển động thích hợp trong mạch L3GD20
  • DMA đa năng: Bộ điều khiển DMA 16 luồng với hỗ trợ FIFO và hỗ trợ cụm
  • RTC: đo độ chính xác của giây, lịch trong phần cứng
  • Kết nối nâng cao
    • Thiết bị / máy chủ / bộ điều khiển OTGtốc độ cao USB 2.0 với PHY
    • Bộ điều khiển / máy chủ / OTG tốc độcao / tốc độ cao USB 2.0 với DMA chuyên dụng, PHY và ULPI tốc độ cao
    • 10/100 Ethernet MAC với DMA chuyên dụng:hỗ trợ phần cứng IEEE 1588v2, MII / RMII

Sơ lược về Kit:

  • Kit đã bao gồm mạch nạp nên khi nạp không cần sử dụng đến các thiết bị như ST-Linker mà có thể nạp code qua ứng dụng ST-Link Utility
  • Kit có tích hợp Micro Vi điều khiển (Micro Controller Unit – MCU) là đơn vị xử lý nhỏ, nó được tích hợp toàn bộ các bộ nhớ như ROM, RAM, các Port truy xuất, giaotiếp ngoại vi trực tiếp trên một con chip hết sức nhỏ gọn.
  • Màn hình QVGA TFT LCD 2.4” hiển thị màu
  • 6Led bao gồm:
    • LD1 (đỏ/xanh) cho giao tiếp USB
    • LD2 (đỏ) dành cho cấp nguồn 3.3V
    • 2 Led người dùng: LD3 (xanh) và LD4 (đỏ)
    • 2 Led USB OTG: LD5 (xanh) VBUS và LD6(đỏ) OC
  • 2 nút bấm: User và Reset
  • Cổng kết nối USB OTG với chuẩn micro-AB
  • Cảm biến con quay hồi quy xoay 3 trục xyz
  • Cổng USB cấp nguồn 3V hoặc 5V
  • Tính năng đầu tiên là tích hợp SD-Link/V2 hỗ trợ 2 chế độ nạp code chạy và debug
  • Tính năng mbed-enabled : nhằm đảm bảo các nhà phát triển có thể sử dụng các công nghệ Mbed (Mbed OS, Mbed Linux và các công cụ khác) trên một loạt các phần cứng đủ điều kiện.
  • Tính năng cảm biến con quay hồi quy xoay Kit theo 3 trục xyz
  • Tích hợp màn hình Led có hỗ trợ cảm ứng
  • Kết nối USB có các chức năng chính:
    • Cổng debug
    • Cổng COM ảo
    • Lưu trữ Mass
    • Nạp nguồn cho Kit
    • Giao tiếp USB OTG chuẩn micro-AB

Sơ đồ Kit các cổng nguồn và cổng USB giao tiếp như hình:

Code demo (tác giả có comment trong code nhé):

/**
 *	Keil project for USB HID Host
 *
 *
 *	Before you start, select your target, on the right of the "Load" button
 *
 *
 *	@author		Tilen Majerle
 *
 *
 *	@email		tilen@majerle.eu
 *
 *
 *	@website	http://stm32f4-discovery.com
 *
 *
 *	@ide		Keil uVision 5
 *
 *
 *	@packs		STM32F4xx Keil packs version 2.2.0 or greater required
 *
 *
 *	@stdperiph	STM32F4xx Standard peripheral drivers version 1.4.0 or greater required
 *
 *
 */

/* Include core modules */

#include "stm32f4xx.h"

/* Include my libraries here */

#include "defines.h"

#include "tm_stm32f4_disco.h"

#include "tm_stm32f4_delay.h"

#include "tm_stm32f4_usb_hid_host.h"

#include <stdio.h>

int main(void) {

	TM_USB_HIDHOST_Result_t USB_HID_Status;		/* USB HID Host status */

	TM_USB_HIDHOST_Keyboard_t Keyboard_Data;	/* Keyboard handler */

	TM_USB_HIDHOST_Mouse_t Mouse_Data;			/* Mouse handler */

	
	/* Initialize system */

	SystemInit();

	
	/* Leds init */

	TM_DISCO_LedInit();

	
	/* Delay init */

	TM_DELAY_Init();

	
	/* Init USB HID */

	TM_USB_HIDHOST_Init();


	while (1) {

		/* Process USB HID */

		/* This must be called periodically */

		TM_USB_HIDHOST_Process();
		
		/* Get connected device */

		USB_HID_Status = TM_USB_HIDHOST_Device();
		
		/* Switch status */

		switch (USB_HID_Status) {

			/* Keyboard connected */

			case TM_USB_HIDHOST_Result_KeyboardConnected:
				
				/* GREEN led ON */

				TM_DISCO_LedOn(LED_GREEN);
			
				/* Get keyboard data */

				TM_USB_HIDHOST_ReadKeyboard(&Keyboard_Data);

				/* Check if keyboard button is pressed */

				if (Keyboard_Data.ButtonStatus == TM_USB_HIDHOST_Button_Pressed) {

					if (Keyboard_Data.Button == 'a') {			/* Turn on RED led on 'b' button */

						TM_DISCO_LedOn(LED_RED);

					} else if 

(Keyboard_Data.Button == 'm') {	/* Turn off RED led on 'm' button */

						TM_DISCO_LedOff(LED_RED);

					}

				}

				
				break;

			
			/* Mouse connected */

			case TM_USB_HIDHOST_Result_MouseConnected:

				
				/* RED led ON */

				TM_DISCO_LedOn(LED_RED);

			
				/* Get mouse data */

				TM_USB_HIDHOST_ReadMouse(&Mouse_Data);

			
				/* Check buttons */

				if (Mouse_Data.LeftButton == TM_USB_HIDHOST_Button_Pressed) {	/* Left button */

					TM_DISCO_LedOn(LED_GREEN);
									/* Toggle GREEN led */

				}

				if (Mouse_Data.RightButton == TM_USB_HIDHOST_Button_Pressed) {	/* Right button */

					TM_DISCO_LedOff(LED_GREEN);
									/* Toggle GREEN led */

				}

				if (Mouse_Data.MiddleButton == TM_USB_HIDHOST_Button_Pressed) {	/* Middle button */

					TM_DISCO_LedToggle(LED_GREEN);
								/* Toggle GREEN led */

				}

				if (Mouse_Data.DiffX != 0 || Mouse_Data.DiffY != 0) {

					/* If there is a difference for mouse movement at any coordinate */

					TM_DISCO_LedToggle(LED_GREEN);

								/* Toggle RED led */

					
					/* If you need to move cursor now at fix position */

					/* Positions are stored like this */

					//Mouse_Data.AbsoluteX //Absolute X position for LCD

					//Mouse_Data.AbsoluteY //Absolute Y position for LCD

				}

			
				break;

			
			/* No device connected */

			case TM_USB_HIDHOST_Result_Disconnected:

				
				/* Turn off leds */

				TM_DISCO_LedOff(LED_RED | LED_GREEN);

			
				break;

			
			/* Device is not supported */

			case TM_USB_HIDHOST_Result_DeviceNotSupported:

				
				/* Device is not supported */

				/* Toggle leds forever */

				TM_DISCO_LedToggle(LED_RED | LED_GREEN);

				/* Delay */

				Delayms(50);

			
				break;

			
			/* Error occurred somewhere */

			case TM_USB_HIDHOST_Result_Error:

				
				/* Error occurred */

				/* Toggle RED LED forever */

				TM_DISCO_LedToggle(LED_RED);

				/* Delay */

				Delayms(50);

			
				break;

			
			/* Library is not initialized */

			case TM_USB_HIDHOST_Result_LibraryNotInitialized:

				
				/* Library is not initialized */

				/* Toggle GREEN LED */

				TM_DISCO_LedToggle(LED_GREEN);

				/* Delay */

				Delayms(50);

			
				break;

		}

	}

}

Link hướng dẫn: https://stm32f4-discovery.net/2014/08/library-31-usb-hid-host-for-stm32f4xx-devices/

Review sách “Đi tìm lẽ sống” và lẽ sống của lập trình viên như mình

Xin chào mọi người, tạm dừng bài viết về Tìm hiểu về blockchain trong lĩnh vực giáo dục (Phần 1) , nay mình muốn review về cuốn sách “Đi tìm lẽ sống” mà mình mua dạo gần đây. Trong cuộc sống cũng như trong việc học tập, làm việc công sở, có lắm lúc chúng ta tự hỏi ý nghĩa cuộc sống là gì và làm sao để đi tìm nó. Lắm lúc chúng ta rơi vào “trạng thái tồn tại chân không” là không biết mình tồn tài làm gì và chán nản thực sự. 

Ok nay mình chia sẻ một chút về mình và review cuốn sách, dạo này mình chạy đồ án cũng như học tiếng Anh để ra trường. Giờ tiếng Anh đã xong rồi thi TOEIC 700, bây giờ mình sẽ tập trung làm đồ án các môn còn lại. Thực sự lắm lúc không hiểu học nhiều như vậy có ý nghĩa gì không nhưng quay đi lại thấy những cố gắng của mình chắc chắn không vô ích. Giống như Viktor E. Frankl có nói “Dù là để tốt hơn hay là làm xấu đi con người vẫn phải quyết định trong mọi thời điểm rằng cái gì là dấu ấn trong sự tồn tại của mình”. Chúng ta vẫn phải sống, làm việc và xác định được ý nghĩa của cuộc sống và công việc của mình.

Nói về cuốn sách được chia làm 2 phần: 
+ Phần 1: Những trải nghiệm của tác giả trong trại tập trung
+ Phần 2: Sơ lược về liệu pháp ý nghĩa
Tác giả đã trải qua những đau khổ trong trại tập trung nơi mà Đức quốc xã bắt các công dân Do thái đến và làm việc khổ sai trong diều kiện làm việc tồi tệ. Trong chương này mọi người sẽ thấy tác giả không đi chi tiết vào việc miêu tả nổi đau sự cơ cực khi làm việc mà tập trung vào các tác giả cũng như các bạn của tác giả cố gắng tạo ra những suy nghĩ những động lực để tồn tại. Tác giả là một người cực giỏi trong việc biết tạo ra những tưởng tượng những sức mạnh tinh thần để vượt qua thực tại đau khổ từ đó tạo ra những suy nghĩ về ý nghĩ cuộc sống. Tiếp theo đó là chương 2 nơi tác giả đi một cách tóm lược về liệu pháp ý nghĩa, sự tồn tài, tìm ra ý nghĩa cuộc sống từ tình yêu, đau khổ. Chương này mang đến người đọc nhiều khía cạnh phân tích cũng như ví dụ mà tác giả đưa ra từ bà mẹ đau khổ muốn tự tử vì đứa con tật nguyền nhưng đứa trẻ ấy lại khao khát sống vì cậu tìm thấy ý nghĩa cuộc sống cho tới ví dụ về sự đau khổ của một bác sĩ về người vợ đã mất, nhưng khi thay đổi góc nhìn vì ông có thể chịu nỗi đau đớn “khi người thân yêu ra đi” này thay cho người vợ, ông bác sĩ đã trở nên ổn định tâm lý hơn. Và các phân đoạn cuối phân tích cho người đọc các khái niệm trong liệu pháp ý nghĩa này. Mọi người có thể mua sách giấy online trên các trang mua sách vì mua vậy sẽ rẻ hơn mà chất lượng rất ok cũng giống mình đi mua trực tiếp chỉ có điều phải chờ ship thôi 😀 hoặc đọc ebook online như vậy cũng là một cách giúp các bạn tiết kiệm thời gian khi phải tìm mua và đặt sách các kiểu.

Mình là một người sống 50-50 giữa cảm xúc và lý trí nên nhiều khi cũng cảm thấy trống rỗng nếu không được làm việc. Cuộc sống và công việc, học tập liên tục tạo nên sự cố gắng trong mình, không được bỏ cuộc, phấn đấu vì gia đình vì ý nghĩa của nó và vì em gái của mình. Mọi người ơi, trong mỗi hoàn cảnh lúc bạn cảm thấy buồn nhất, trống rỗng nhất hãy nghĩ về người bạn, người em, cha mẹ hay một điều ý nghĩa nào đó trong cuộc đời của bạn dù điều đó ở trong quá khứ hay tương lai. Hãy lấy nó làm mục tiêu, làm điểm tựa làm ý nghĩa giúp mình hoàn thiện mình hơn ngày hôm nay nhé! Cuộc đời lập trình viên là chuỗi ngày không ngừng cố gắng, học tập những cái mới trong thế giới công nghệ thay đổi từng giờ này và nếu ta không cố gắng không vì lẽ sống của mình chúng ta rất dễ chán và từ bỏ vì vậy hãy cố gắng lên nhé mọi người! 

Ký hiệu Big O – Sử dụng toán học để đo lường hiệu quả thuật toán

Dạo này mình đang cày lại cấu trúc dữ liệu và giải thuật, tìm được một bài viết hay nên tiện thể viết bài chia sẻ về Big O luôn. Mọi người học cấu trúc dữ liệu và giải thuật hay trong lập trình chắc đều nghe tới khái niệm Big O rồi chứ nhỉ, ví dụ như giải thuật tìm kiếm này mất O(n) đơn vị để thực hiện,….

Vậy Kí hiệu Big O là gì?

Ký hiệu Big O là ngôn ngữ chúng ta sử dụng để nói về một thuật toán, giải thuật mất bao lâu để chạy. Đó là cách chúng ta so sánh hiệu quả của các cách tiếp cận khác nhau (áp dụng các giải thuật) đối với một vấn đề.

Nó giống như toán học ngoại trừ nó là một loại toán học tuyệt vời, không nhàm chán, nơi bạn có thể bỏ qua các chi tiết vê mặt toán học và chỉ tập trung vào những gì cơ bản nhất đang xảy ra bên trong theo các quy tắc của chúng ta đặt ra (sẽ nói trong phần ví dụ các quy tắc này). Với ký hiệu O, chúng ta thể hiện thời gian chạy theo thuật ngữ – brace yourself – mình không dịch thuật ngữ vì có thể làm biến tấu ý nghĩa, theo mình hiểu là tự gấp đôi chính mình – tốc độ thực thi nhanh hay chậm liên quan tới tập đầu vào vì tập đầu vào tùy ý có thể lớn thì tốc độ có thể chậm hơn bình thường. Vậy hãy chia nhỏ vấn đề trong câu phân tích này ra nhé:
1. Thời gian chạy nhanh hay chậm như thế nào – Thật khó để biết thời gian chạy chính xác của một thuật toán. Nó phụ thuộc vào tốc độ của bộ xử lý, máy tính khác đang chạy cái gì, v.v.. Vì vậy, thay vì nói về thời gian chạy trực tiếp, chúng tôi sử dụng ký hiệu O để nói về thời gian chạy nhanh đến mức như thế nào.
2. Liên quan đến tập đầu vào – Nếu thực tế nếu chúng ta tham gia chạy việt dã chúng ta có thể dễ dàng đo được thời gian chạy theo giây, phút, giờ. Nhưng trong việc thực thi thuật toán, với ký hiệu Big O, chúng ta sử dụng kích thước của đầu vào, mà chúng ta gọi là “(n)” Vì vậy, chúng ta có thể nói những thứ như thời gian chạy tăng lên “theo thứ tự kích thước của đầu vào” (O(n)) hoặc “theo thứ tự của bình phương kích thước của đầu vào” (O(n^2)).
3. Tập đầu vào tùy ý – Thuật toán của chúng ta có thể có các bước có vẻ tốn kém khi n nhỏ nhưng sẽ bị “lu mờ” bởi các bước khác khi n trở nên rất lớn. Đối với việc phân tích O, chúng ta quan tâm nhất về những thứ phát triển nhanh nhất khi đầu vào tăng lên, bởi vì mọi thứ khác nhanh chóng bị lu mờ khi n trở nên rất lớn. (Nếu bạn biết asymptote là gì, bạn có thể thấy tại sao “phân tích O” đôi khi được gọi là “phân tích tiệm cận“. Ý ở đây muốn nói nếu tập hợp chúng ta với phần tử ít khoảng 100, 1000 phần tử thì khi duyệt chúng ta chỉ mất O(100), O(1000) nhưng nếu tập đầu vào là tập 1 triệu phần tử mà duyệt thì O bây giờ nhìn vào chúng ta sẽ phát sợ ngay chính vì vậy mà các giải thuật ra đời để giảm chi phí thực hiện này xuống. Continue reading

So sánh hiệu năng về thời gian duyệt phần tử khi sử dụng vòng lặp For, ForEach, Iterator và ListIterator trong Java Collection

Các khái niệm và so sánh sự khác nhau mình đã làm một bài viết So sánh Iterator và ListIterator rồi nên hôm nay mình sẽ đi vào luôn ví dụ để so sánh hiệu năng về thời gian duyệt phần tử của 4 người bạn này nhé.

import java.util.ArrayList;
import java.util.Iterator;
import java.util.ListIterator;

class EffectiveIterator {
    ArrayList<Integer> list = new ArrayList<>();

    //init list with 1000 elements
    public  EffectiveIterator() {
        for (int i = 0; i < 1000; i++) {
            list.add(i);
        }
    }

    // method browse using For
    public void browseFor(int times) {
        int temp = 0;
        for (int i = 0; i < times; i++) {
            for (int j = 0; j < list.size(); j++) {
                temp = list.get(j);
            }
        }
    }

    // method browse using ForEach
    public void browseForEach(int times) {
        int temp = 0;
        for (int i = 0; i < times; i++) {
            for (Integer integer : list) {
                temp = integer;
            }
        }
    }

    // method browse using Iterator
    public void browseIterator(int times) {
        int temp = 0;
        Iterator<Integer> integers = list.iterator();
        for (int i = 0; i < times; i++) {
            while (integers.hasNext()) {
                temp = integers.next();
            }
        }
    }

    // method browse using ListIterator
    public void browseListIterator(int times) {
        int temp = 0;
        ListIterator<Integer> listIterator = list.listIterator();
        for (int i = 0; i < times; i++) {
            while (listIterator.hasNext()) {
                temp = listIterator.next();
            }
        }
    }

    public static void main(String[] args) {
        EffectiveIterator checkEffectiveIterator = new EffectiveIterator();

        long start = System.currentTimeMillis();
        checkEffectiveIterator.browseFor(10000000);
        long end = System.currentTimeMillis();
        System.out.println("Time For: " + (end - start) + " ms");

        start = System.currentTimeMillis();
        checkEffectiveIterator.browseForEach(10000000);
        end = System.currentTimeMillis();
        System.out.println("Time ForEach: " + (end - start) + " ms");

        start = System.currentTimeMillis();
        checkEffectiveIterator.browseIterator(10000000);
        end = System.currentTimeMillis();
        System.out.println("Time Iterator: " + (end - start) + " ms");

        start = System.currentTimeMillis();
        checkEffectiveIterator.browseListIterator(10000000);
        end = System.currentTimeMillis();
        System.out.println("Time ListIterator: " + (end - start) + " ms");
    }
}

Kết quả ta được:

Capture

Một sự hơn thua “đáng sợ” extreme_sexy_girl

Cảm ơn mọi người đã theo dõi bài viết nhé! Hẹn gặp mọi người trong bài viết tiếp theo.  Code bài này mình tham khảo ở blog : Hà Viết Tráng’s blog

Quy trình từ zero đến hero của một dự án thực tế

Hé lô mọi người lại là mình đây, tuần sau mình sẽ được làm một dự án thực nên tiện đây muốn chia sẻ với anh em chút kinh nghiệm làm việc mà mình học được ở công ty nè.
Giai đoạn 1. Đầu tiên các bạn sẽ nhận được một bản requirement, các bạn có thể xem nó như một bài kiểm tra đi thì cái yêu cầu này là để bài. Tiếp theo sau khi có đề bài, team leader và technical cùng anh em trong team sẽ ngồi lại với nhau phân tích requirement vạch ra các hướng phân tích và yêu cầu mọi người phải hiểu tường tận chi tiết bản yêu cầu này để tránh gặp phải rắc rối sau này khi mình đã build hoàn chỉnh mà sai requirement thì rất mất thời gian. Sau khi họp xong nếu có câu hỏi thác mắc gì chúng ta sẽ note lại và gửi Q&A với khách hàng. Khi mọi vấn đề đã được giải đáp ổn thỏa thid chúng ta bắt đầu gì tiếp theo nhỉ? Thiết kế database, viết code luôn …..
Giai đoạn 2. Câu trả lời là “Chưa phải lúc này”, sau khi đã confirm với khách hàng team sẽ họp lại tạo một bản High-level hệ thống các module cần làm trong dự án, trong các module đó chúng ta sẽ có các chức năng gì? Trong từ chức năng chúng ta lại tiếp tục chia nhỏ thành các task. Mockup UI từ bản Module này từ đó gửi lại cho khách hàng confirm.
Giai đoạn 3. Tiến hành ước lượng thời gian cuae các module, qua trình implementation và integration lên front-end. Quá trình này được gọi là Estimationm, việc ước lượng thời gian này càng chi tiết, càng chia nhỏ các task ra thì chúng ta càng kế hoạch được dự án, quản lý thời gian cũng như dự án, resource của team một cách tốt nhất. Mình sẽ chia sẻ với các bạn chi tiết về giai đoạn này trong các bài viết sau.
Giai đoạn 4. Thiết kế database tùy vào độ “khủng” của dự án mà ta lựa chọn cơ sở dữ liệu cho phù hợp và các quan hệ giữa các bảng có cần thiết hay không nếu không chúng ta sẽ tạo ràng buộc dữ liệu ngay trong code mà không cần phải tạo ràng buộc dữ liệu trong database. Bước thiết kế database cũng cực kỳ quan trọng bởi vì chúng ta phải tính các field chúng ta sẽ dùng đến trong quá trình code, cấu trúc database để sau này có chỉnh sửa thì cũng chỉnh sửa mau lẹ gọn gàng :D.
Giai đoạn 5. Sau bước này team sẽ hoàn thành công việc setup project, structure, environment, tạo 1 project trên gitlab. Tiến hành tạo các entity model các package của một dự án. Ở đây mình đang làm việc với dự án Spring Boot Web Application nên sẽ tạo các package như API, Service, Repository, Utils,…
Giai đoạn 6. Tiếp theo lần lượt implement thực thi các module, các bạn nên nhớ bước này chúng ta nên hoàn thành có thứ tự các chức năng sau thì nên hoàn thành chức năng tiền xử lý của nó. Ví dụ chúng ta thực hiện cho Admin tạo user thì cần xử lý các bước đăng nhập, phân quyền, kiểm tra authentication, session, nếu phân quyền liên quan tới các API của bên thứ 3 thì nên hoàn thiện các API này như grant Access Token, refresh Access Token chẳng hạn. Continue reading