Fake and some things about .NET (edit)
- Fake Data
- Fluent Validation
- Identity Server 4 (OAuth2 + OpenID Connect)
- Message Queue + Message Bus + Message Broker
- Load Balancer, Master/Slave, Sharding
- Blockchain
- Sharding & Replication
- Cosmos DB & ASP.NET Core Web API (Template for Cosmos DB : CosmosDbDataRepository<T> : IDataRepository : BaseEntity : CRUD)
- Microsoft.Identity.Web
- Azure Code Samples + HERE
Faker.js
Generate massive amounts of realistic fake data in Node.js and the browser
https://github.com/marak/Faker.js/
Bogus
A simple and sane fake data generator for C#
https://github.com/bchavez/Bogus/
https://stackoverflow.com/questions/6625490/c-sharp-library-to-populate-object-with-random-data/
var user = testUsers.Generate();
Console.WriteLine(user.DumpAsJson());
Types of auto generated data include:
- Addresses: ZipCode, City, Country, Latitude, etc.
- Commerce: Department name, ProductName, ProductAdjective, Price, etc.
- Company: CompanyName, CatchPhrase, Bs, etc.
- Date: Past, Soon, Between, etc.
- Finance: Account number, TransactionType, Currency, CreditCardNumber, etc.
- Image URL: Random image, Animals image, Nature image, etc.
- Internet: Email, DomainName, Ipv6, Password, etc.
- Lorem: single word, Words, Sentence, Paragraphs, etc.
- Name: FirstName, LastName, etc.
- Rant: Random user review, etc.
- System: FileName, MimeType, FileExt, etc.
Faker.Data
Faker library for fake data
https://github.com/FermJacob/Faker.Data
MockData
https://www.codeproject.com/Tips/697006/Creating-mock-data-for-software-testing
- .NET Framework 4.5
FakeItEasy
The easy mocking library for .NET
https://github.com/FakeItEasy/FakeItEasy/
https://daniel-krzyczkowski.github.io/Easy-mocking-in-C-code-with-FakeItEasy-library/
- .NET Framework 4.5
Faker.NET
C# port of the Ruby Faker gem (http://faker.rubyforge.org/) and is used to easily generate fake data: names, addresses, phone numbers, etc.
https://www.nuget.org/packages/Faker.Net/
- .NET Framework 4.0
https://github.com/slashdotdash/faker-cs/
- .NET Framework 4.0
.NET Fiddle
C# Online Compiler | .NET Fiddle
Data Access: CRUD
public interface IDataRepository<T> where T : BaseEntity { Task<T> AddAsync(T newEntity); Task<T> GetAsync(string entityId); Task<T> UpdateAsync(T entity); Task DeleteAsync(string entityId); Task<IReadOnlyList<T>> GetAllAsync(); }
public abstract class BaseEntity { [JsonPropertyName("id")] public string Id { get; set; } }
1) Message Queue
https://toidicodedao.com/2019/10/08/message-queue-la-gi-ung-dung-microservice/
Message Queue nôm na là Queue (hàng đợi), chứa Message (Tin nhắn) như hộp thư.
- RabbitMQ
- Kafka
2) Message Bus
Message Bus còn được gọi Service Bus.
Message Bus cung cấp phương thức để một hoặc nhiều application giao tiếp message đến một hoặc nhiều application khác.
Message Bus không đảm bảo cho việc vào trước xuất trước. Người nhận (Subscribers) đã đăng ký Message Bus có thể nhận message được publish mà không biết về người gửi (Publisher or Sender).
Một số Message Bus được dùng hiện nay:
- Microsoft Azure Service Bus
- Oracle Enterprise Service Bus
3) Message Broker
https://topdev.vn/blog/system-design-co-ban-message-broker/
4) Identity Server 4
IdentityServer4 là 1 framework .NET dành cho OpenID Connect và OAuth 2.0.
Hiện tại, mình chỉ biết 1 vài thư viện làm nhiệm vụ như Authorization Server:
- Identity Server 4
- Azure Active Directory
- Auth0
- OpenIddict
- Google OAuth 2.0
- Facebook Login
OAuth2 có 4 loại grant type:
- Resource Owner Password Credentials
- Authorization Code
- Implicit
- Client Credentials
https://alexbilbie.com/guide-to-oauth-2-grants/
OAuth 2.0 Password Grant
https://developer.okta.com/blog/2018/06/29/what-is-the-oauth2-password-grant
Khi nào thì sử dụng password grant?
Chỉ nên sử dụng cho những ứng dụng thực sự được tin tưởng vì nó trực tiếp xử lý thông tin đăng nhập của người dùng.
Ứng dụng đưa ra một form cho phép người dùng nhập thông tin đăng nhập (ví dụ: username/password).
Ứng dụng gửi thông tin đăng nhập cùng thông tin định danh của mình lên Authorization Server. Authorization Server xác thực thông tin, trả lại access token và refresh token (nếu có).
Ứng dụng sử dụng access token truy cập tài nguyên trên Resource Server.
5) OAuth 2 Simplified
This post describes OAuth 2.0 in a simplified format to help developers and service providers implement the protocol.
https://aaronparecki.com/oauth-2-simplified/#authorization
Roles
The Third-Party Application: "Client"
The client is the application that is attempting to get access to the user's account. It needs to get permission from the user before it can do so.
The API: "Resource Server"
The resource server is the API server used to access the user's information.
The Authorization Server
This is the server that presents the interface where the user approves or denies the request. In smaller implementations, this may be the same server as the API server, but larger scale deployments will often build this as a separate component.
The User: "Resource Owner"
The resource owner is the person who is giving access to some portion of their account.
6) Ba yếu tố quan trọng của một hệ thống
- Performance: Tốc độ phản hồi của hệ thống, được đo bằng đơn vị thời gian, có thể là giây hoặc mili giây. Hệ thống hoạt động càng nhanh thì người dùng làm được nhiều việc hơn, đem lại lợi nhuận cao hơn. Hệ thống mà quá chậm thì sẽ không có ai sử dụng.
- Availability: Chỉ khả năng hoạt động của hệ thống vào mọi thời điểm, được đo bằng uptime. Ví dụ như trong 100 ngày, hệ thống hoạt động 99 ngày còn 1 ngày die thì uptime là 99/100 = 99%.
- Uptime của các hệ thống lớn như Facebook, Google, Uber phải luôn >99%, vì chỉ cần ngưng hoạt động vài phút là các công ty sẽ thiệt hại từ vài nghìn cho tới vài triệu đô.
- Hôm trước phỏng vấn ở Agoda, anh Director chia sẻ 1 giây Agoda kiếm được 1000 đô. Bum bum bum 3s là 3000 đô. Do đó hệ thống mà sập cỡ 5-10 phút là thiệt hại sẽ… hơi bị bự.
- Scalability: Khả năng mở rộng của hệ thống. Liệu khi có đông user hơn thì hệ thống có thể mở rộng (scale) được không? Việc scale có thể thực hiện dễ dàng, nhanh chóng hay không? Chi phí scale như thế nào?
- Ví dụ lượng người dùng tăng gấp 10, ta chỉ cần tăng gấp 2 hoặc gấp 5 lượng server là phục vụ được, hệ thống có scalability cao. Tuy nhiên, nếu ta phải tăng gấp 100, gấp 200 lượng server, hoặc không thể thêm server để phục vụ chừng đó người dùng, hệ thống có scalability thấp.
7) Một số đặc điểm chính của một mạng Blockchain lý tưởng:
- Decentralization (Phi tập trung)
- Security (Tính bảo mật)
- Scalability (Khả năng mở rộng)
8) Một số tình huống phổ biến trong đó có thể có ích để bảo vệ cơ sở dữ liệu:
- Lượng dữ liệu ứng dụng tăng lên vượt quá dung lượng lưu trữ của một nút cơ sở dữ liệu.
- Khối lượng ghi hoặc đọc vào cơ sở dữ liệu vượt quá những gì một nút hoặc bản sao đọc của nó có thể xử lý, dẫn đến thời gian phản hồi hoặc thời gian chờ bị chậm.
- Băng thông mạng được ứng dụng yêu cầu vượt quá băng thông có sẵn cho một nút cơ sở dữ liệu và bất kỳ bản sao đọc nào, dẫn đến thời gian phản hồi hoặc thời gian chờ bị chậm.
9) Sharding là để mở rộng ghi và Replication là để mở rộng đọc
10) KHI CODE MÀ BÍ THÌ PHẢI LÀM SAO?
5 KINH NGHIỆM SIÊU HAY ĐỂ GIẢI QUYẾT VẤN ĐỀ
1. Google vấn đề để xem người khác giải quyết ra sao
2. Tách thành nhiều vấn đề nhỏ hơn cho dễ xử lý
3. Thử giải quyết vấn đề dễ hơn trước
4. Đọc lại document, hỏi ý kiến đồng nghiệp
5. Đi uống, đi dạo đi ngủ (1 mình)
11) BỐN PHƯƠNG PHÁP RÈN LUYỆN TƯ DUY LẬP TRÌNH
1. Học kĩ và nắm vững căn bản trước
2. Làm bài tập về thuật toán
3. Làm sản phẩm để có tư duy sản phẩm
4. Học rộng hơn, học những thứ mình chưa biết
12) Định hướng tương lai
Leadership, Managing People, Managing Product
Technical thì nên theo dõi Newsletter (tổng hợp nhiều nguồn)
- Newsletter Software Lead Weekly: Tổng hợp những bài viết hay về leadership trong ngành phần mềm
- Newsletter Pointer.io: Tuyển chọn những bài viết đáng đọc, đang chú ý cho developer
- Grokking Newsletter: Newsletter tiếng Việt, giới thiệu bài viết hay về DB, software architecture cho anh em
- JavaScript Weekly, Front-end Focus, Node Weekly: Chọn lọc các repo độc lạ, article hay về front-end, JavaScript
- Engineering Blog của các công ty lớn như Facebook, Uber, Instagram
- Các Youtube channel Tech Conference Coding Tech, JSConf, ComputerPhile. Hoặc đi Tech Conference luôn cho máu
- Trên dev.to, medium,com cũng có nhiều bài hay, nhưng thượng vàng hạ cám nhiều, phải biết chọn lọc
Technical Lead
Bạn cần hiểu biết về công nghệ sâu và rộng, vì chính bạn là người lựa chọn công nghệ, qui trình… cho 1 dự án. Những quyết định lớn về thiết kế, cấu trúc code … sẽ do bạn chịu trách nhiệm. Ở giai đoạn này, ngoài việc technical “cứng”, bạn còn phải giỏi thuyết trình, hướng dẫn, giải thích… Vì sao á? Lead đưa ra vấn đề thì phải giải thích hợp lý, thành viên khác nó mới hiểu, nể và làm theo chứ. Mức lương cho vị trí này vào khoảng 1500-2500$.
Software Architect
Muốn đạt chức danh này, ít nhất bạn phải có 10-20 năm trong ngành. (Nhìn thằng nào mặt mũi trẻ măng mà vỗ ngực tự xưng SA thì đừng tin). Công việc của bạn khá gian khổ: Từ một yêu cầu “mơ hồ” của khách hàng, bạn phải làm việc với BA để đánh giá solution, làm việc với PM để xây dựng 1 team, làm việc với Technical Lead để thiết kế, đưa ra các quyết định quan trọng về kiến trúc. Vị trí này mặc dù không có quyền quản lý, nhưng lại có khá nhiều quyền lực ngầm. Mức lương cũng ngang ngửa hoặc cao hơn cả manager.
Console.WriteLine(System.DateTime.UtcNow.ToString("yyyyMMdd_hhmmsttt")); //=> 20210130_032054PM
Console.WriteLine(System.DateTime.UtcNow.ToString("yyyyMMdd_HHmms")); // => 20210130_152054