Công Nghệ
Review và giải thích sâu về framework, ngôn ngữ, AI, blockchain… ngắn gọn, dễ hiểu, cập nhật liên tục như git pull ‑‑rebase.
1826 bài viết

SOLID – Đã đến lúc cần thay đổi bản thân
Người viết: Quách Đại Phúc Có thể trong quá trình làm việc với người thông minh chú ý quan sát thì chỉ cần vài tháng, nhưng với những người kém thông minh hơn hay lười hơn thì phải mất cả năm để nhận ra code mình có vấn đề và Bốc mùi đến như thế nào, rõ ràng việc code sạch đẹp, dễ maintain nó cũng như cách sống vậy, có người gọn gàng ngăn nắp, người thì bừa bộn, luộm thuộm (Mình không nói những bạn code không sạch là bừa bộn nhé cái này chỉ là ví dụ). Mình tự nhận là người khá ngăn nắp nhưng code thì không sạch (chán). Và mình nghĩ cũng đã đến lúc chúng ta cần tự trau chuốt lại cả cách sống và cách code nếu chúng ta còn tiếp tục muốn sống sót được trong cái nghề mà mỗi ngày càng có nhiều người giỏi hơn, thông minh hơn chúng ta xuất hiện. Chúng ta không thể thông minh, nhanh nhẹn hơn họ được nhưng bù lại chúng ta có sự chỉn chu và những kinh nghiệm xương máu. Để tự thanh lọc mình trong việc code mình bắt đầu lang thang đi tìm những design patterns, Principles … thứ mà những anh hùng đi trước để lại cho hậu thế. Mình đã tìm hiểu DDD, DI …tuy nhiên thấy chúng khá khó hiểu và gây lú (vì mình già rồi chăng). Và nguyên lý SOLID xuất hiện trong quá trình tìm kiếm, đọc … ồ mình nên bắt đầu từ đây, nó khá dễ hiểu, có nhiều người đã áp dụng và chia sẻ trước đây rồi. Tại sao mình lại không chứ. Đầu tiên hãy cùng bắt đầu thanh lọc cơ thể bằng những khái niệm cơ bản...

Những thư viện và framework của JavaScript mà bạn không thể bỏ qua
JavaScript đã tồn tại hơn 20 năm, và là một trong những ngôn ngữ không ngừng phát triển. Ngôn ngữ này gần đây trải qua giai đoạn tăng trưởng rất nhanh, và liệu các kỹ thuật JavaScript cho front-end nổi bật hiện nay sau vài năm nữa có còn được chú ý nữa không. Tuy nhiên, quan trọng là luôn dẫn đầu cuộc chơi bằng cách sử dụng những công nghệ những công cụ và framework mới nhất cho việc phát triển tốt hơn. Bài viết này sẽ giúp bạn khám phá những thư viện và framework của JavaScript bạn nên cân nhắc học ngay bây giờ. Tuyển dụng Javascript lương cao cần gấp Giới thiệu Môi trường JavaScript đã trở nên khổng lồ. Nó có hệ sinh thái của riêng nó với thư viện, frameworks, công cụ, các quản lý package và các ngôn ngữ mới để biên dịch ra JavaScript. Thật thú vị, npm, là một trình quản lý package thực thụ cho JavaScript, cũng là một software registry lớn nhất của thế giới. Đây là một đoạn trích từ một bài viết xuất bản trên Linux.com vào tháng 1 năm 2017. Với hơn 350,000 packages, npm registry chứa gần như hơn gấp đôi package registry phổ biến tiếp theo (Apache Maven). Thực tế, hiện thời nó là package registry lớn nhất thế giới. 8 tháng nhanh chóng trôi qua, và hiện giờ có 500,000 packages trong npm registry. Là một sự tăng trưởng khủng khiếp so với những package repo khác. Nguồn: ModuleCounts.com Làm lập trình front-end , bắt kịp với những công cụ và thư viện JavaScript thực sự rất quan trọng. Khi một công nghệ trở nên phổ biến, nhu cầu sẽ tăng cao, lần lượt sẽ xuất hiện nhiều công việc lập trình hơn...

Spring Boot là gì? Demo dự án Spring Boot trong 5 phút
Bài viết được sự cho phép của tác giả Lê Chí Dũng Spring là một framework quen thuộc với các lập trình viên, nhưng Spring vẫn tồn tại nhiều nhược điểm khi hoạt động đơn lẻ. Spring boot ra đời để cải thiện những hạn chế này của Spring. Cùng Station D tìm hiểu Spring boot là gì ? Các tính năng nổi bật và demo cách tạo một dự án Spring Boot chỉ trong 5 phút. Spring Boot là gì? Spring Boot được xây dựng dựa trên nền của Spring Framework, phát triển bởi ngôn ngữ Java. Nó là một phiên bản có tính tự động hoá cao hơn và đơn giản hơn của Spring. Spring Boot khiến cho việc tạo và khởi chạy ứng dụng chỉ diễn ra trong vòng vài phút. Lịch sử phát triển của Spring Boot Spring Boot được phát triển bởi Pivotal Software, với phiên bản đầu tiên (Spring Boot 1.0) được phát hành vào tháng 4 năm 2014. Mục tiêu ban đầu của Spring Boot là giải quyết những hạn chế và phức tạp trong việc cấu hình Spring Framework truyền thống. Spring Framework, mặc dù rất mạnh mẽ và linh hoạt, nhưng yêu cầu nhiều cấu hình thủ công và có thể trở nên cồng kềnh khi xây dựng các ứng dụng phức tạp. Trước khi Spring Boot ra đời, việc cấu hình một ứng dụng Spring thường đòi hỏi nhiều file XML hoặc các class Java cấu hình, gây khó khăn cho việc bảo trì và phát triển. Spring Boot được giới thiệu như một cách tiếp cận đơn giản và hiệu quả hơn, với các cấu hình tự động và các công cụ hỗ trợ như Spring Initializr, giúp nhà phát triển bắt đầu dự án mới nhanh chóng chỉ...

Tôi là Product Manager. Tôi làm việc gì trong công ty và tổ chức của tôi?
Bài viết được sự cho phép của tác giả Lê Chí Dũng Product Manager (PM – Người quản lý sản phẩm) là một trong những vị trí khó định nghĩa và không có mô tả công việc cụ thể vì mỗi công ty và tổ chức anh ấy được định nghĩa và mô tả công việc cụ thể khác nhau. "Dân làm Product khác hoàn toàn 180 độ với dân làm outsourcing" 3 bài học xương máu mà mỗi Product Manager đều phải trải qua. Nhiều người nghĩ rằng, công việc của một PM sẽ liên quan đến những lĩnh vực sau: Viết code, hệ thống (Technical) Tạo các mock-ups, UX, UI (Design) Ký kết hợp đồng với đối tác bán hàng (Bussiness) Lên kế hoạch truyền thông, PR (Marketing) Nhưng thực tế, những việc trên không phải là công việc mà một PM phải làm. Đây mới là những việc mà PM phải làm: Technology : Bạn không cần thiết phải là developer nhưng bạn phải nắm được công nghệ và kĩ thuật xây dựng nên hệ thống và sản phẩm của mình tối ưu. Để có quyết định đúng đắng đó thì việc tìm hiểu các công nghệ là không thể thiếu và tốt nhất là nên tham khảo ý kiến các senior developer trong team để cùng phát triển. User Experience (UX) : Bạn là người luôn luôn lắng nghe và luôn luôn thấu hiểu trải nghiệm của người dùng. Nên bạn là người dùng đầu tiên trải nghiệm sản phẩm của chính mình. Business : Bạn là người am hiểu mục tiêu của danh nghiệp bạn biết được với hệ thống thế nào và sản phẩm thế nào là mang lại lợi ích cho doanh nghiệp. Và từ các ý kiến trên tôi đút kết ra...

Dịch vụ thị trường vận chuyển và giao nhận Landscape 2020
Nối tiếp báo cáo thị trường IT Landscape 2019, báo cáo mới nhất về thị trường vận chuyển và giao nhận 2020 vừa mới ra mắt, thông số trong báo cáo khá khả quan bất chấp dịch bệnh Covid được xem là một trong những đại dịch làm ảnh hưởng nghiêm trọng đến các ngành nghề khác nhau ở hầu hết các quốc gia, đặc biệt là Châu Âu. Tổng quan về báo cáo Landscape 2020 Theo báo cáo thị trường Vietnam IT Landscape 2020 , tuy 6 tháng đầu năm các ngành có xu hướng “tuột dốc” nhưng với tình hình hiện này thì chúng ta có thể thấy rõ nền kinh tế Việt Nam đang dần khởi sắc ở các ngành nghề nói chung và các công ty công nghệ nói riêng. Trong bài báo cáo này, chúng ta sẽ chỉ tập trung đến tình hình của ngành dịch vụ thị trường vận chuyển và giao nhận. Nhìn chung, tại Việt Nam, các dịch vụ vận chuyển khá được ưa chuộng, nhất là các dịch vụ vận chuyển của những công ty công nghệ như Grab, Goviet, Lalamove, Giaohangnhanh… Theo báo cáo thị trường vận chuyển và giao nhận 2020, trong năm 2011-2017 (6 năm), các dịch vụ vận chuyển, giao nhận công nghệ trong đó có ứng dụng đi lại chỉ có 2 ứng dụng phát triển đó là Uber và Grab, còn ở ứng dụng giao đồ ăn thì có ông trùm độc quyền Now tại thời điểm này. Ứng dụng vận chuyển hàng hóa thì có Vietnam Post, Viettel Post, Grab Express… đa số là các ứng dụng giao hàng được phân nhánh từ các công ty lớn của nhà nước. Nhưng kể từ năm 2018 trở đi, thì dịch vụ vận chuyển và giao...

SNTP – Simple Network Time Protocol là gì?
Bài viết được sự cho phép của tác giả Kiên Nguyễn Hôm nay nhận được task đi fix bug, lò mò điều tra mới biết nó liên quan tới SNTP (Simple Network Time Protocol). Vậy SNTP là gì?. Nốt công tìm hiểu nên viết ra luôn cho anh em xem. Cách thiết lập và duy trì mối quan hệ (networking) hiệu quả Làm thế nào để xây dựng social network bằng Ruby on Rails Đầu tiên thì nói sơ qua về cái bug. Fix bug này cho một application trên MacOS. Ứng dụng khi start sẽ kiểm tra thời gian ở phía client (Mac Mini) và phía Server (Apple time) có chính xác hay không. Hiện tại thì app crash -> banh chành. SNTP có response trả về nhưng app vẫn bị crash 1. Simple Network Time Protocol là gì? Bắt đầu với định nghĩa: The simple network time protocol (SNTP) is a time synchronization protocol of the TCP/IP protocol family. It is based on the connectionless user datagram protocol (UDP) and can be used on all supporting devices to synchronize system time in IP networks (IPv4 and IPv6). Simple Network Time Protocol (SNTP) là phương thức đồng bộ hóa thời gian, thành viên của TCP/IP protocol. Dựa trên kết nối của user datagram protocol (UDP) và có thể sử dụng để đồng bộ hóa tất cả thời gian trên thiết bị. Cả trên IPv4 và IPv6 Đó, theo như cái lý thuyết, đầu tiên SNTP là phương thức đồng bộ thời gian. Trong mạng máy tính, có thể vì các lý do khách quan dẫn tới thời gian ở client và server khác nhau. Kết nối vàng cho biết là kết nối trực tiếp. Đỏ là giao tiếp giữa các máy client với nhau. Nguồn ảnh source: Wikipedia.com Nếu...

Thực thi phương thức kiểm thử NUnit với Command Line
Bài viết được sự cho phép của vntesters.com Bên cạnh việc thực thi các phương thức kiểm thử NUnit với ứng dụng , chúng ta còn có thể ra lệnh thực thi các phương thức kiểm thử với Command Line . Điều này thật sự hữu ích khi chúng ta muốn thiết lập kiểm thử tự động theo lịch ( schedule ). NUnit – Kiểm thử Đơn vị trên Visual Studio Kiểm thử đơn vị trong C# với Nunit và .Net Core Chương trình NUnit-Console NUnit-Console là một chương trình DOS, không có giao diện, được gọi thông cửa sổ Command Line. Kết quả sau khi thực thi sẽ được trả về bằng một tập tin XML. Các lựa chọn ( option ) cho chương trình NUnit-Console này được chia làm 4 nhóm: Lựa chọn phương thức kiểm thử; Thiết lập quá trình thực thi; Thiết lập đầu ra (output) sau khi thực thi và Các lựa chọn khác . Lựa chọn phương thức kiểm thử để thực thi Về mặc định, khi chúng ta gọi chương trình NUnit-Console với một tập tin, NUnit-Console sẽ chạy toàn bộ phương thức kiểm thử có trong tập tin đó. Loại tập tin được hỗ trợ bởi NUnit-Console là: dll, csproj và nunit . Những phương thức kiểm thử nào được đánh dấu Ignore sẽ không được thực thi. Khi gọi chương trình NUnit-Console , chúng ta có thể thực thi một lần nhiều tập tin, cách nhau bằng một khoảng trắng. unit-console [tập tin dll/csproj/nunit] unit-console [tập tin dll/csproj/nunit] [tập tin dll/csproj/nunit] [tập tin dll/csproj/nunit] Thay vì thực thi toàn bộ phương thức kiểm thử có trong dự án kiểm thử, chúng ta có thể lựa chọn thực thi những không gian tên/lớp/phương thức kiểm thử nào chúng ta muốn với hai...

Lưu ý khi chạy async function với vòng lặp
Bài viết được sự cho phép của tác giả Lưu Bình An Để chạy một chuỗi các async function theo thứ tự (tuần tự như chạy tiếp sức) cố định, nếu không để ý chúng ta sẽ có những kết quả không như mong đợi. Luôn dùng for...of Không sử dụng .forEach nếu bên trong callback chứa các hàm cần await . Luôn luôn dùng for..of nếu muốn nó đúng thứ tự 6 lý do Async/Await của Javascript đánh bại Promises RxSwift 3: Thuật ngữ về lập trình bất đồng bộ (Asynchronous programming glossary) Xem thêm các việc làm JavaScript lương cao trên Station D async function asyncProcessing ( ms ) { return new Promise ( resolve => setTimeout ( function ( ) { console . log ( 'wait:' , ms ) ; resolve ( ms ) ; } , ms ) ) ; } async function forOf ( ) { const timeouts = [ 10 , 600 , 200 , 775 , 125 , 990 ] ; let result = [ ] ; for ( const timeout of timeouts ) { result . push ( await asyncProcessing ( timeout ) ) } return result ; } // Kết quả wait: 10 wait: 600 wait: 200 wait: 775 wait: 125 wait: 990 Nếu thay vòng lặp for...of bằng timeouts . forEach ( async timeout => { const a = await asyncProcessing ( timeout ) ; result . push ( a ) ; } ) // kết quả nhận được wait: 10 wait: 125 wait: 200 wait: 600 wait: 775 wait: 990 Hoặc dùng Array.reduce Một lựa chọn khác nếu không thích dùng for...of , kết quả sẽ giống i chang const result = await timeouts . reduce ( async ( sum , timeout ) => { return [ ... (...

Loại bỏ các phần tử trùng trong một ArrayList như thế nào trong Java 8?
Bài viết được sự cho phép của tác giả Giang Phan Trong bài viết Loại bỏ các phần tử trùng trong một ArrayList , tôi đã giới thiệu với các bạn các cách để loại bỏ phần tử trùng trong một ArrayList với Java <= 7. Trong bài này, tôi sẽ giới thiệu với các bạn một số cách khác với sự hỗ trợ của các tính năng mới trong Java 8 . Sử dụng phương thức distinct() trong Stream API Phương thức distinct() trả về một Stream gồm các phần tử duy nhất, việc xác định các phần tử trùng lặp được so sánh theo theo phương thức Object.equals(Object) . 10 Java Web Framework tốt nhất 10 lý do cho thấy tại sao bạn nên theo học ngôn ngữ lập trình Java Đối với ordered Stream, thứ tự sắp xếp các phần tử là ổn định (stable) : đối với các phần tử trùng lặp, phần tử xuất hiện đầu tiên trong vùng gặp phải được giữ nguyên. Đối với các unordered Stream, không đảm bảo tính ổn định (unstable) thứ tự các phần tử. Ví dụ: package com.gpcoder.remove_duplicate; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; public class RemoveDuplicateInArrayList1 { public static void main(String[] args) { List listWithDuplicateElements = new ArrayList(); listWithDuplicateElements.add("JAVA"); listWithDuplicateElements.add("J2EE"); listWithDuplicateElements.add("JSP"); listWithDuplicateElements.add("SERVLETS"); listWithDuplicateElements.add("JAVA"); listWithDuplicateElements.add("STRUTS"); listWithDuplicateElements.add("JSP"); List listWithoutDuplicateElements = listWithDuplicateElements .stream() .distinct() .collect(Collectors.toList()); System.out.println(listWithoutDuplicateElements); // [JAVA, J2EE, JSP, SERVLETS, STRUTS] } } Sử dụng phương thức removeIf() Phương thức removeIf() : chấp nhận đối số là 1 Predicate , nó loại bỏ tất cả các phần tử của Collection thỏa mãn điều kiện đã cho. Ý tưởng cách này là lợi dụng tính năng không chứa phần tử trùng của HashSet / LinkedHashSet để kiểm tra tồn tại và loại bỏ phần nó. Ví dụ: package com.gpcoder.remove_duplicate; import...

Tổng hợp các công cụ kiểm thử chức năng cho web
Bài viết được sự cho phép của vntesters.com Bạn đang tìm kiếm công cụ kiểm thử chức năng cho web và đang không biết bắt đầu từ đâu, như thế nào? Bài viết này sẽ giúp bạn tiết kiệm được rất nhiều thời gian google. Các bạn xem thêm các công cụ kiểm thử chức năng cho Desktop ở đây. Nếu bạn có danh sách khác, hãy chia sẻ bằng cách để lại chú thích nhé. 10 bước để bắt đầu áp dụng kiểm thử tự động vào dự án 10 lý do kiểm thử phần mềm trở thành một nghề thời thượng Xem thêm nhiều việc làm Tester lương cao trên Station D No. Product Vendor 1 actiWATE Actimind 2 AppsWatch NRG 3 Badboy Badboy Software 4 Canoo WebTest Canoo 5 eValid Software Research 6 IeUnit 7 Imprimatur 8 Internet Macros Opus 9 HTTP::Recorder Opus 10 iRise Application Simulator iRise 11 ITP Incanica 12 liSA iTKO 13 Netvantage Functional Tester Netvantage Technologies 14 PesterCat PesterCat 15 QA Wizard Seapine 16 Ranorex Ranorex Software 17 Rational Robot Rational Software 18 Sahi 19 SAMIE 20 Selenium ThoughtWorks 21 SilkTest Segue Software, Inc. 22 SoapTest Parasoft 23 soapui eviware 24 Solex NEOMAlogic 25 Squish froglogic GmbH 26 swete Neal Lester 27 TestSmith Quality Forge 28 TestWeb Original Software 29 vTest Verisium 30 WatiN 31 Watir 32 WebAii ArtOfTest 33 Webcorder Crimson Solutions 34 WebInject WebInject 35 WebKing ParaSoft 36 WET Qantom Software 37 WSUnit 38 Yawet InforMatrix Bài viết gốc được đăng tải tại vntesters.com Có thể bạn quan tâm: Kiểm thử tính năng Tìm kiếm – bạn làm như thế nào? Các chức năng cần tìm hiểu khi lựa chọn công cụ tự động cho kiểm thử di động Kiểm thử phần mềm là gì? Các phương pháp kiểm thử được...

ReactJS – Tìm hiểu về Component Life Cycle
Bài viết được sự cho phép của BBT Tạp chí Lập trình Trong bài trước chúng ta đã tìm hiểu về Component API. Trong bài này, chúng ta sẽ tìm hiểu về vòng đời của một React Component (Component Life Cycle) và các methods để quản lý vòng đời. Học ReactJS trong 15 phút ReactJS - Những điều bạn cần phải biết Lifecycle Method – Component Life Cycle componentWillMount đây là method sẽ được thực thi trước khi một component được render trên cả server side và client side componentDidMount method này được thực thi khi 1 component được render trên client side. Đây là nơi các hàm AJAX, DOM hoặc update state được thực thi. Method này cũng được sử dụng để kết nối tới các JS Framework khác và các function với delayed execution như setTimeout hoặc setInterval. componentWillReceiveProps sẽ được thực thi ngay khi thuộc tính props được update và trước khi component được render lại. shouldComponentUpdate sẽ trả về kết quả true or false. Phương thức này sẽ xác định một component có được update hay không. Mặc định là true, nếu bạn không muốn một component render lại khi update state hay propst thì return giá trị thành false. componentWillUpdate được gọi khi chúng ta update state của component trước khi nó render lại. componentDidUpdate sau khi componentWillUpdate ở trên được gọi xong thì đến lượt method này được gọi. componentUnmount được gọi khi một component được xóa khỏi React. Bây giờ chúng ta comment lại code component Form ở các bài trước để tránh rối. Xong rồi thì chúng ta tạo một component như đoạn code sau: class Counter extends React.Component { componentWillMount(){ console.log("componentWillMount"); } componentDidMount() { console.log("componentDidMount"); } shouldComponentUpdate(newProps, newState) { return true; } componentWillUpdate(nextProps, nextState) { console.log('Component WILL UPDATE!'); } componentDidUpdate(prevProps, prevState)...

6 ví dụ để bạn yêu luôn observable
Bài viết được sự cho phép của tác giả Lưu Bình An Thêm những lý do để dụ dỗ bạn xài Observable Observable mình dịch ra tiếng việt thế này cho bạn dễ hình dung. Một khi bạn bật chế độ observable với một đứa con gái nào đó, là bạn đang trong giai đoạn bị nó ám ảnh, nhất cử nhất động của nó bạn điều để ý, nó hắc xì bạn cũng biết, một tuần nó mặc mấy bộ đồ bạn cũng biết. Chỉ cần nghe tiếng bước chân là bạn biết được hôm nay nó mang đôi dép gì (mức độ này hơi kinh khủng lắm rồi) là bạn có những phản xạ vô điều kiện bộc phát nơi cửa miệng “Chiều nay trời mưa nhe em, mang dép lào đi cho chuẩn”. Phản xạ này là gọi là subscription Rồi quay lại với vấn đề kỹ thuật, bài này không giải thích rõ Observable pattern, các khái niệm chính của nó, nếu muốn bạn đọc lại bài này trước đây có viết rồi , như cái tựa bài viết nó spoil hết cái nội dung rồi “Ví dụ để thấy tại sao chúng ta nên bật chế độ Observable với một em gái nào đó” Thần chú mình muốn bạn thuộc lầu Lập trình Reactive là làm việc với luồng dữ liệu bất đồng bộ Lại phải giải thích câu này chút, Nếu những gì diễn ra trên ứng dụng đang xảy ra một cách bất đồng bộ, khả năng rất cao là Observable sẽ giúp ích cho cuộc sống của anh em chúng ta bớt khổ hơn . Có nhiều cách làm và thư viện handle vụ luồng dữ liệu bất đồng bộ này, tuy nhiên, Observable có gì mà cool, sắp được chuẩn hóa...