<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://willnguyen.work//feed.xml" rel="self" type="application/atom+xml" /><link href="https://willnguyen.work//" rel="alternate" type="text/html" /><updated>2026-08-12T00:46:30+07:00</updated><id>https://willnguyen.work//feed.xml</id><title type="html">About</title><subtitle>Show cases project</subtitle><author><name>Linh Nguyen</name></author><entry><title type="html">Different Types of Data Caching</title><link href="https://willnguyen.work//web%20architecture/different-types-of-caching/" rel="alternate" type="text/html" title="Different Types of Data Caching" /><published>2020-02-06T00:00:00+07:00</published><updated>2020-02-06T00:00:00+07:00</updated><id>https://willnguyen.work//web%20architecture/different-types-of-caching</id><content type="html" xml:base="https://willnguyen.work//web%20architecture/different-types-of-caching/"><![CDATA[<h2 id="caching">Caching</h2>

<ul>
  <li>Client-Side Caching</li>
  <li>Server-Side Caching</li>
  <li>Content Delivery Network (CDN) Cache</li>
  <li>Page Cache</li>
  <li>Opcode Cache</li>
  <li>Object Cache</li>
  <li>Database Cache</li>
</ul>

<h2 id="client-side-caching">Client-Side Caching</h2>

<p>Browser caching</p>

<ul>
  <li>Local Storage</li>
  <li>Session Storage</li>
  <li>IndexedDB</li>
  <li>Web SQL</li>
</ul>

<h2 id="server-side-caching">Server-Side Caching</h2>

<ul>
  <li>Redis, memcache.</li>
  <li>File cache.</li>
</ul>

<h2 id="content-delivery-network-cdn-cache">Content Delivery Network (CDN) Cache</h2>

<p>Cloudflare, Cloudfront AWS, Cloud CDN.</p>

<h2 id="page-cache">Page Cache</h2>]]></content><author><name>Linh Nguyen</name></author><category term="Web Architecture" /><category term="Cache" /><summary type="html"><![CDATA[Different Types of Data Caching]]></summary></entry><entry><title type="html">Spark</title><link href="https://willnguyen.work//data%20engineering/Spark/" rel="alternate" type="text/html" title="Spark" /><published>2019-12-24T00:00:00+07:00</published><updated>2019-12-24T00:00:00+07:00</updated><id>https://willnguyen.work//data%20engineering/Spark</id><content type="html" xml:base="https://willnguyen.work//data%20engineering/Spark/"><![CDATA[]]></content><author><name>Linh Nguyen</name></author><category term="Data Engineering" /><category term="Data Engineering" /><summary type="html"><![CDATA[Spark]]></summary></entry><entry><title type="html">Map Reduce</title><link href="https://willnguyen.work//data%20engineering/mapreduce/" rel="alternate" type="text/html" title="Map Reduce" /><published>2019-12-23T00:00:00+07:00</published><updated>2019-12-23T00:00:00+07:00</updated><id>https://willnguyen.work//data%20engineering/mapreduce</id><content type="html" xml:base="https://willnguyen.work//data%20engineering/mapreduce/"><![CDATA[<p>MapReduce is a programming model that allows us to express the simple computations. (batch processing jobs)
We were trying to perform but hides the messy details of parallelization, fault-tolerance, data distribution and load balancing in a library, large dataset.</p>

<p>Users specify:</p>

<ul>
  <li><strong>a map</strong> function that processes a key/value pair to generate a set of intermediate key/value pairs, and</li>
  <li><strong>a reduce</strong> function that merges all intermediate values associated with the same intermediate key.</li>
</ul>

<p><img src="/assets/images/data_engineering/2019-12-23-mapreduce/mapreduce.png" alt="png" /></p>

<p>Threading programming:
    task manager, delivery task to worker on thread pool, after worker done, get more to execute. Until done.</p>

<h2 id="mapreduce-vs-spark">MapReduce vs Spark</h2>

<p>The primary difference between MapReduce and Spark is that MapReduce uses persistent storage and Spark uses Resilient Distributed Datasets</p>

<p><strong>Spark:</strong>
    Support real-time streaming.
    Lesser line code. Features API
    In-memory rather disk write.</p>

<p>Ref: <a href="https://static.googleusercontent.com/media/research.google.com/en//archive/mapreduce-osdi04.pdf">white paper by Google in 2004</a></p>]]></content><author><name>Linh Nguyen</name></author><category term="Data Engineering" /><category term="Data Engineering" /><summary type="html"><![CDATA[Map Reduce]]></summary></entry><entry><title type="html">Architectural Patterns</title><link href="https://willnguyen.work//web%20architecture/architectural-patterns/" rel="alternate" type="text/html" title="Architectural Patterns" /><published>2019-04-04T00:00:00+07:00</published><updated>2019-04-04T00:00:00+07:00</updated><id>https://willnguyen.work//web%20architecture/architectural-patterns</id><content type="html" xml:base="https://willnguyen.work//web%20architecture/architectural-patterns/"><![CDATA[<p>An architectural pattern is a general, reusable solution to a commonly occurring problem in software architecture within a given context. Architectural patterns are similar to software design pattern but have a broader scope.</p>

<ul>
  <li>Layered pattern</li>
  <li>Client-server pattern</li>
  <li>Master-slave pattern</li>
  <li>Pipe-filter pattern</li>
  <li>Broker pattern</li>
  <li>Peer-to-peer pattern</li>
  <li>Event-bus pattern</li>
  <li>Model-view-controller pattern</li>
  <li>Blackboard pattern</li>
  <li>Interpreter pattern</li>
</ul>

<h3 id="layered-pattern-for-desktop-app-e-commerce-web-app">Layered pattern: for desktop app, e-commerce web app</h3>

<ul>
  <li>Presetation layer</li>
  <li>Application layer</li>
  <li>Business logic layer</li>
  <li>Data access layer</li>
</ul>

<h3 id="client-server-pattern-email-docs-sharing-and-banking">Client-server pattern: email, docs sharing and banking</h3>

<h3 id="master-slave-pattern-database-replication-peripherals-connected-to-a-bus-in-a-computer-system">Master-slave pattern: database replication, Peripherals connected to a bus in a computer system</h3>

<h3 id="pipe-filter-pattern-compilers-workflow">Pipe-filter pattern: Compilers, Workflow</h3>

<h3 id="broker-pattern-message-broker-queue">Broker pattern: Message broker queue,</h3>

<h3 id="peer-to-peer-pattern-file-sharing-networks-multimedia-protocols">Peer-to-peer pattern: File-sharing networks, Multimedia protocols</h3>

<h3 id="event-bus-pattern-android-development-notification-services">Event-bus pattern: Android development, Notification services</h3>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>o	event source, event listener, channel and event bus
o	Listeners subscribe to particular channels.
</code></pre></div></div>

<h3 id="model-view-controller-pattern-for-web-app">Model-view-controller pattern: For web app</h3>

<h3 id="blackboard-pattern-speech-recognition-vehicle-identification-and-tracking-protein-structure-identification">Blackboard pattern: Speech recognition, Vehicle identification and tracking, Protein structure identification</h3>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>o	Blackboard
o	knowledge source
o	control component
</code></pre></div></div>

<h3 id="interpreter-pattern">Interpreter pattern</h3>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>o	Database query languages
o	Languages used to describe communication protocols.
</code></pre></div></div>

<p>Ref:
<a href="https://towardsdatascience.com/10-common-software-architectural-patterns-in-a-nutshell-a0b47a1e9013">https://towardsdatascience.com/10-common-software-architectural-patterns-in-a-nutshell-a0b47a1e9013</a></p>]]></content><author><name>Linh Nguyen</name></author><category term="Web Architecture" /><category term="Web Architecture" /><summary type="html"><![CDATA[Architectural Patterns]]></summary></entry><entry><title type="html">Agile Manifesto</title><link href="https://willnguyen.work//agile%20development/agile-manifesto/" rel="alternate" type="text/html" title="Agile Manifesto" /><published>2017-06-08T00:00:00+07:00</published><updated>2017-06-08T00:00:00+07:00</updated><id>https://willnguyen.work//agile%20development/agile-manifesto</id><content type="html" xml:base="https://willnguyen.work//agile%20development/agile-manifesto/"><![CDATA[<p>Better ways of developing software by doing it and helping others do it.</p>

<ul>
  <li><strong>Individuals and interactions</strong> over processes and tools</li>
  <li><strong>Working software</strong> over comprehensive documentation</li>
  <li><strong>Customer collaboration</strong> over contract negotiation</li>
  <li><strong>Responding to change</strong> over following a plan</li>
</ul>

<h2 id="the-agile-industrial-complex-everyone-know-agile-but-really">The agile industrial complex. Everyone know agile, but really?</h2>

<p>Many argue that “faux agile,” as it’s also called, and its evil twin “dark agile,” are exacerbated by the monetization of agile education and consulting.</p>

<p>“There’s cargo cult agile where you’re doing and saying the right things, but you don’t understand the fundamental principles. You’re not getting the results,” Buchanan said.</p>

<p>Call it “faux,” “dark,” or “cargo cult,” these agile subversions often lead to situations that fly in the face of the Manifesto’s intentions—micromanagement, burnout-rate pacing, lack of delivery, and adherence to process over principles register as the most egregious—even if their practitioners come with a certificate. Unfortunately, these dark agile experiences cause some people to swear off agile altogether, (or rewrite it to reflect their real-world experience with it.)</p>

<h2 id="what-does-it-all-mean">What does it all mean?</h2>

<p>So, the agile principles existed before the Agile Manifesto. People applied them to software development. Those values were captured in the Agile Manifesto. Then, people took the Manifesto’s principles and started applying them to their own work.</p>

<p>“In a lot of ways, the Manifesto is a basis of a conversation,” Wortham said. “Here’s how I interpret it. How do you interpret it? All right, let’s figure out how to work together.”</p>

<p>Ref:</p>

<ul>
  <li><a href="https://agilemanifesto.org/principles.html">The Twelve Principles of Agile Software</a></li>
  <li><a href="https://www.atlassian.com/agile/manifesto">https://www.atlassian.com/agile/manifesto</a></li>
</ul>]]></content><author><name>Linh Nguyen</name></author><category term="Agile Development" /><category term="Agile Model" /><category term="Scrum Model" /><summary type="html"><![CDATA[Standing amidst the technological revolution, is the Agile Manifesto actually help?]]></summary></entry><entry><title type="html">Requirements Gathering</title><link href="https://willnguyen.work//requirements/requirements-gathering/" rel="alternate" type="text/html" title="Requirements Gathering" /><published>2017-05-10T00:00:00+07:00</published><updated>2017-05-10T00:00:00+07:00</updated><id>https://willnguyen.work//requirements/requirements-gathering</id><content type="html" xml:base="https://willnguyen.work//requirements/requirements-gathering/"><![CDATA[<p><img src="/assets/images/requirements/tree-swing-project-management-large.jpg" alt="This doesn't have to be you! " class="center-image" /></p>

<p>This process often involves a set of activities including:</p>

<ul>
  <li><strong>Requirements elicitation</strong>: getting business requirements  from relevant stakeholders to understand user needs;</li>
  <li><strong>Requirements documentation</strong>: codifying that information in the form of user stories and feature specifications so they are accessible to the project team;</li>
  <li><strong>Requirements understanding</strong>: making sure everyone’s on the same page about what the heck you’re all trying to build.</li>
</ul>

<h2 id="1-establish-project-goals-and-objectives-early">1. Establish project goals and objectives early</h2>

<p>Simple: does it help accomplish a goal, or does it satisfy an objective?</p>

<h2 id="2-document-every-requirements-elicitation-activity">2. Document every requirements elicitation activity</h2>

<p>When you’re in the midst of stakeholder interviews and documentation review, you can often feel like you have a great grasp on things.</p>

<p>But then a week goes by,you realize you don’t quite have a full grasp of your business requirements.</p>

<p>You’ll see in #3…</p>

<h2 id="3-be-transparent-with-requirements-documentation">3. Be transparent with requirements documentation</h2>

<p>Sure, you understand the requirements. And your stakeholders understand the requirements. But do your stakeholders understand your understanding of the requirements?</p>

<p>This transparency not only helps make sure everyone’s on the same page, it fosters a sense of project buy-in all the way through your project, beginning with the business requirements. And it circumvents the issue of someone saying “hey, you agreed to X but it’s not here!” 6 weeks into the project. If it’s not in the notes, it didn’t happen.</p>

<h2 id="4-talk-to-the-right-stakeholders-and-users">4. Talk to the right stakeholders and users</h2>

<p>A project can often have “hidden” stakeholders. Ask probing questions in your kickoff and initial meetings to try and get to who the real users are. Often those people are not going to be the main decision-makers, but their buy-in is essential to a successful project.</p>

<p><strong>Disgruntled users who are forced to use a system every day that was designed without their input are a key ingredient for a failed project.</strong></p>

<h2 id="5-dont-make-assumptions-about-requirements">5. Don’t make assumptions about requirements</h2>

<p>The devil truly is in the details, but you can catch him by the tail if you ask a lot of questions and don’t rely on assumptions.</p>

<h2 id="6-confirm-confirm-confirm">6. Confirm, confirm, confirm</h2>

<p>This ties into “be transparent” but is not entirely the same thing. Just sharing your notes with a stakeholder is great, but far more valuable is actually having a quick review with them and getting their official sign-off.</p>

<p>This is true for meeting notes, user stories, diagrams, wireframes, really any kind of requirements artifact that you are creating. Get actual confirmation from your stakeholders that you are representing the requirements correctly in whatever format you’re using, then move on.</p>

<h2 id="7-practice-active-listening">7. Practice active listening</h2>

<p>Don’t assume that you’re always getting the whole story – listen for little cues that reveal pain points, desires, unstated goals, and assumptions.</p>

<h2 id="8-focus-on-business-requirements-not-tools">8. Focus on business requirements, not tools</h2>

<p>Focusing on and listening to what your stakeholder needs, not what your tool-of-choice happens to do best.Remember: <strong>requirements are about the WHAT, not the HOW.</strong></p>

<h2 id="9-prioritize-your-product-features">9. Prioritize your product features</h2>

<p>In an agile methodology, we work towards a Minimum Viable Product (MVP), that would count as a successful product at launch.</p>

<h2 id="10-remember-that-you-didnt-get-everything">10. Remember that you didn’t get everything</h2>

<p>Even the best requirements gatherer is going to miss things. Why? Because you and your stakeholders are human beings, and human beings make mistakes. You will think of things later that you forgot to ask. Your stakeholder will think of things that they forgot to mention. Things will change. Priorities will shift.</p>

<p>Ref:</p>

<ul>
  <li><a href="https://www.phase2technology.com/blog/successful-requirements-gathering">https://www.phase2technology.com/blog/successful-requirements-gathering</a></li>
</ul>]]></content><author><name>Linh Nguyen</name></author><category term="Requirements" /><category term="Requirements Gathering" /><summary type="html"><![CDATA[10 Steps To Successful Requirements Gathering]]></summary></entry><entry><title type="html">SQL vs. NoSQL</title><link href="https://willnguyen.work//database/sql-vs-nosql/" rel="alternate" type="text/html" title="SQL vs. NoSQL" /><published>2017-05-05T00:00:00+07:00</published><updated>2017-05-05T00:00:00+07:00</updated><id>https://willnguyen.work//database/sql-vs-nosql</id><content type="html" xml:base="https://willnguyen.work//database/sql-vs-nosql/"><![CDATA[]]></content><author><name>Linh Nguyen</name></author><category term="Database" /><category term="Database" /><summary type="html"><![CDATA[The SQL vs NoSQL Difference: MySQL vs MongoDB]]></summary></entry><entry><title type="html">REST Architecture</title><link href="https://willnguyen.work//web%20architecture/restful-architecture/" rel="alternate" type="text/html" title="REST Architecture" /><published>2017-03-05T00:00:00+07:00</published><updated>2017-03-05T00:00:00+07:00</updated><id>https://willnguyen.work//web%20architecture/restful-architecture</id><content type="html" xml:base="https://willnguyen.work//web%20architecture/restful-architecture/"><![CDATA[<ul>
  <li><strong>REST</strong>: <strong>R</strong>epresentational <strong>S</strong>tate <strong>T</strong>ransfer.</li>
  <li>REST is a <strong>style of software architecture</strong> which exploits the existing technology Web protocols - HTTP: GET, POST, …</li>
  <li>RESTful ref to <strong>Web Services implementing</strong> such an architecture</li>
  <li>A term coined by <a href="https://en.wikipedia.org/wiki/Roy_Fielding" target="_blank">Roy Fielding</a> in 2000</li>
</ul>

<h2 id="architectural-constraints">Architectural Constraints</h2>

<p>REST defines <strong>6 architectural constraints</strong> which make any web service – a true RESTful API.</p>

<ul>
  <li>Uniform interface</li>
  <li>Client–server</li>
  <li>Stateless</li>
  <li>Cacheable</li>
  <li>Layered system</li>
  <li>Code on demand (optional)</li>
</ul>

<h2 id="uniform-interface">Uniform interface</h2>

<p>Define resources: e.g. api/users for (website, mobile app, other services)</p>

<p>There are 4 guidelines principle:</p>

<ul>
  <li><strong>Resource-Based</strong>: EX: API/users.</li>
  <li><strong>Manipulation of Resources Through Representations</strong>: Client get user id and then delete and modify resource based on that user id.</li>
  <li><strong>Self-descriptive Messages</strong>: URI + HTTP methods + data as json</li>
  <li><strong>Hypermedia</strong> as the Engine of Application State (HATEOAS): Include other links for each response, so client can discover more other resources easily.</li>
</ul>

<h2 id="clientserver">Client–server</h2>

<p>Client application (Mobile, Front end Angular) and server application(Back end) MUST be able to evolve separately without any dependency on each other.
A client should know only resource URIs, and that’s all.</p>

<h2 id="stateless">Stateless</h2>

<p>The server will not store anything about HTTP request.</p>

<p>Advantages:</p>

<ul>
  <li>Scaling by deploying multiple servers. Because no session related dependency.</li>
  <li>Less complex – by removing all server-side state synchronization logic.</li>
  <li>Easy to cache.</li>
  <li>Never loses track, because the client sends all necessary information with each request.</li>
</ul>

<h2 id="cacheable">Cacheable</h2>

<p>A well-managed caching partially or completely eliminates some client–server interactions</p>

<h2 id="layered-system">Layered system</h2>

<p>An application architecture needs to be composed of multiple layers.
Intermediary servers may improve system availability by enabling load-balancing and by providing shared caches.</p>

<h2 id="code-on-demand-optional">Code on demand (optional)</h2>

<p><strong>return executable code</strong> to support a part of your application, e.g., clients may call your API to get a UI widget rendering code.</p>]]></content><author><name>Linh Nguyen</name></author><category term="Web Architecture" /><category term="Web Architecture" /><summary type="html"><![CDATA[REST and RESTful]]></summary></entry><entry><title type="html">Inversion of Control</title><link href="https://willnguyen.work//web%20architecture/IoC/" rel="alternate" type="text/html" title="Inversion of Control" /><published>2016-06-15T00:00:00+07:00</published><updated>2016-06-15T00:00:00+07:00</updated><id>https://willnguyen.work//web%20architecture/IoC</id><content type="html" xml:base="https://willnguyen.work//web%20architecture/IoC/"><![CDATA[<p>Propose by Martin Fowler:</p>

<p>“Inversion of Control is too generic a term, and thus people find it confusing. As a result with a lot of discussion with various IoC advocates we settled on the name Dependency Injection”.</p>

<p>Patterns are all about removing dependencies from your code.
Callbacks</p>

<p><strong>Related:</strong>
    Event-driven programming, the event loop and dispatch of events/messages is handled by the framework</p>

<p>Is programming principle which one of SOLID principle?</p>

<p>The term is related to, but different from, the dependency inversion principle, which concerns itself with decoupling dependencies between high-level and low-level layers through shared abstractions</p>]]></content><author><name>Linh Nguyen</name></author><category term="Web Architecture" /><category term="Web Architecture" /><summary type="html"><![CDATA[Inversion of Control]]></summary></entry><entry><title type="html">Design Pattern</title><link href="https://willnguyen.work//object%20oriented%20design/design-pattern/" rel="alternate" type="text/html" title="Design Pattern" /><published>2016-05-10T00:00:00+07:00</published><updated>2016-05-10T00:00:00+07:00</updated><id>https://willnguyen.work//object%20oriented%20design/design-pattern</id><content type="html" xml:base="https://willnguyen.work//object%20oriented%20design/design-pattern/"><![CDATA[<p>A design pattern is a general repeatable solution to a commonly occurring problem in software design.
It is a description or template for how to solve a problem that can be used in many different situations.</p>

<h2 id="creational-design-patterns">Creational design patterns</h2>

<p>These design patterns are all about class instantiation. This pattern can be further divided into class-creation patterns and object-creational patterns. While class-creation patterns use inheritance effectively in the instantiation process, object-creation patterns use delegation effectively to get the job done.</p>

<ul>
  <li>Abstract Factory: Creates an instance of several families of classes</li>
  <li>Builder: Separates object construction from its representation</li>
  <li>Factory Method: Creates an instance of several derived classes</li>
  <li>Object Pool: Avoid expensive acquisition and release of resources by recycling objects that are no longer in use</li>
  <li>Prototype: A fully initialized instance to be copied or cloned</li>
  <li>Singleton: A class of which only a single instance can exist</li>
</ul>

<h2 id="structural-design-patterns">Structural design patterns</h2>

<p>These design patterns are all about Class and Object composition. Structural class-creation patterns use inheritance to compose interfaces. Structural object-patterns define ways to compose objects to obtain new functionality.</p>

<ul>
  <li>Adapter: Match interfaces of different classes</li>
  <li>Bridge: Separates an object’s interface from its implementation</li>
  <li>Composite: A tree structure of simple and composite objects</li>
  <li>Decorator: Add responsibilities to objects dynamically</li>
  <li>Facade: A single class that represents an entire subsystem</li>
  <li>Flyweight: A fine-grained instance used for efficient sharing</li>
  <li>Private Class Data: Restricts accessor/mutator access</li>
  <li>Proxy: An object representing another object</li>
</ul>

<h2 id="behavioral-design-patterns">Behavioral design patterns</h2>

<p>These design patterns are all about Class’s objects communication. Behavioral patterns are those patterns that are most specifically concerned with communication between objects.</p>

<ul>
  <li>Chain of responsibility: A way of passing a request between a chain of objects</li>
  <li>Command: Encapsulate a command request as an object</li>
  <li>Interpreter: A way to include language elements in a program</li>
  <li>Iterator: Sequentially access the elements of a collection</li>
  <li>Mediator: Defines simplified communication between classes</li>
  <li>Memento: Capture and restore an object’s internal state</li>
  <li>Null Object: Designed to act as a default value of an object</li>
  <li>Observer: A way of notifying change to a number of classes</li>
  <li>State: Alter an object’s behavior when its state changes</li>
  <li>Strategy: Encapsulates an algorithm inside a class</li>
  <li>Template method: Defer the exact steps of an algorithm to a subclass</li>
  <li>Visitor: Defines a new operation to a class without change</li>
</ul>

<p>Ref:</p>

<ul>
  <li><a href="https://refactoring.guru/" target="_blank">Refactoring.guru</a></li>
  <li><a href="https://sourcemaking.com/" target="_blank">sourcemaking.com</a></li>
</ul>]]></content><author><name>Linh Nguyen</name></author><category term="Object Oriented Design" /><category term="Web Architecture" /><summary type="html"><![CDATA[Design Pattern]]></summary></entry></feed>