<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[The Push]]></title><description><![CDATA[Cool stories, opinions, tips and guides from the world of software development.]]></description><link>https://blog.snisni.it</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1648374988230/n9bNai-12.png</url><title>The Push</title><link>https://blog.snisni.it</link></image><generator>RSS for Node</generator><lastBuildDate>Sat, 11 Apr 2026 17:57:48 GMT</lastBuildDate><atom:link href="https://blog.snisni.it/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[We rebuilt our platform from scratch: here's what we learnt]]></title><description><![CDATA[Preamble: A bit of context on where I am in my career
Since my last article a lot has changed, both for me and for the world of software development in general. The biggest leap was, of course, the me]]></description><link>https://blog.snisni.it/rebuilt-platform-from-scratch</link><guid isPermaLink="true">https://blog.snisni.it/rebuilt-platform-from-scratch</guid><dc:creator><![CDATA[Mattia Sinisi]]></dc:creator><pubDate>Wed, 11 Mar 2026 08:22:53 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/z03mWBdAq5I/upload/e2d4a042df846220f48fe3df790005e0.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>Preamble: A bit of context on where I am in my career</h1>
<p>Since my last article a lot has changed, both for me and for the world of software development in general. The biggest leap was, of course, the meteoric rise of AI systems, especially in the software development space with new tools such as coding agents.</p>
<p>Like these AI systems, I have also grown and learnt a lot in these past years, I have changed companies 2 times, I went from a software consultancy company called <em>Key2 Business</em>, to my first product-oriented company called <em>Everli</em> (a grocery delivery application). Here I was the youngest, less experienced developer in my team, and I was followed carefully, everyone took their time in teaching me best practices and design patterns for effective collaboration on our codebases (which were unlike anything I had seen up until that point), thanks to them I went from an okay developer delivering code quickly to a more careful and pragmatic thinker when it came to implementing new feature or solving old bugs.</p>
<blockquote>
<p>The best resource I gained was a new way of thinking and approaching problems in a more meticulous fashion.</p>
</blockquote>
<p>Then, after a couple of years, I decided to leave the company. A decision I made with a heavy heart, since the synergy of the group was something I feared I would never encounter again, I felt really lucky to be a part of that team.</p>
<p>That fear was short-lived though. I got hired as as Senior Full-Stack Developer at a company called <em>Contents</em>, an AI-driven content creation and orchestration platform. The team I met was small yet highly productive, they were navigating a complex shift in vision that would decide the future of the company: “are we B2C or B2B focused?” was the prevailing question at the time, a particularly difficult question to ask, since these 2 markets have drastically different approaches.</p>
<ul>
<li><p>For B2C you have the freedom to read feedback, do research, test features and THEN maybe ship them.</p>
</li>
<li><p>For B2B the client dictates everything, most importantly how much time the team had to complete the work.</p>
</li>
</ul>
<p>So there it was: a codebase torn between 2 worlds struggling to accomodate either one of them, a team with very little time to implement anything cleanly and a rising technical debt.</p>
<blockquote>
<p>“<strong>Make it work</strong>” was the mantra</p>
</blockquote>
<p>Here’s the story of what once was, the processes we adopted to change everything from the ground up, the amazing results we accomplished, and what key lessons I learnt along the way.</p>
<h1>The old platform(s): A post-mortem</h1>
<p>In this section we discuss (without breaking my NDA) the state in which I found the platform when I joined and what caused it to be so.</p>
<p>We all love a good roast, especially when it comes to bad codebases. “<em>Look at the mess they’ve made! Let’s point and laugh!</em>” is the tone adopted by most articles discussing such matters, but alas it’s useless, it only brings ridicule to what COULD have been a learning experience. Let’s try, then, to write a small post-mortem, explaining the many (and I mean many) fallacies of the codebase and try to extract valuable advice for future implementations.</p>
<h2>Lack of consistency</h2>
<p>When trying to run against your competition, especially in the AI market in 2021-2023, quick development decisions and pivots are almost a weekly occurrence, in this environment the priority is speed, with consistency and code quality as an afterthought.</p>
<p>So it goes, every developer on the team implemented everything in the quickest and dirtiest way possible, and everyone had their own way of writing code, resulting in a codebase without standards, without design patterns, where every piece of code did a number of things obfuscated by incomprehensible variable and method names, where entire chunks of code were duplicated and re-implemented except for a couple of lines, where logic was partly implemented on the backend and partly on the frontend, and where <code>if</code> statements stretched into the hundreds of lines, each added after every reported bug.</p>
<p>We had a complex and incomprehensible maze of dependencies, where changing how a date is displayed to the user broke the login and who knows what else.</p>
<h2>Lack of agency</h2>
<p>At the beginning of each sprint, which lasted about a week, a new set of tasks without descriptions was assigned to the tech team, each new feature was implemented by the marketing and sales team without consulting with the rest of the company, resulting in meetings to discuss what to do (which ate a lot of the already limited development time), without discussing how. That thing needed to be done, and it needed to be done in a week, “<em>figure it out, devs</em>” was the only directive most of the time.</p>
<p>When we started writing code no consideration was given to how long something took to implement, or better ways of implementing it, the client had already signed a contract, and we needed to uphold it no matter what. And so another week of rushed development began. No agency to the developers whatsoever, this would be one of the first things that needed to change.</p>
<h2>Lack of documentation</h2>
<p>Each second of development time was very valuable, so no time was given to creating a proper documentation where one could outline standard, best practices, code style guidelines, architectural decisions, and code philosophies to uphold during the development process. Everyone did things their own way, on top of the maze of mismatching design patterns that was already there. But no time to think, no time to document, there’s only time to implement.</p>
<h2>Lack of reviews</h2>
<p>Since no time could be dedicated at the start of development to write documentation, no time could be dedicated at the end of development for code reviews. And how could we? The two are interlinked. No standards were set in stone and written down so, even IF we had time to do code reviews, the reviewers would not have any standards on which to base their judgement upon.</p>
<h2>Lack of communication</h2>
<p>No communication whatsoever between the teams, no communication whatsoever between members of the same team, no communication whatsoever with the clients… you know how this ends. When one of the tech teams needed to implement, for example, an endpoint so that other tech teams could perform actions on their service, they would just do it with no consideration of how the others could implement it and then move on to different things, wasting time and massively increasing the code complexity of whoever needed to interact with that service.</p>
<p>The lack of documentation and reviews was also deeply ingrained with this issue as well.</p>
<p>There was never a time where all teams were on the same page on the status of the platform, or even on what the parts of the platforms did what. Everyone was lost in the same fog as everyone else.</p>
<hr />
<h1>Interlude</h1>
<p>Let’s take a brief moment, nestled between the old and the new, to give praise to the people that stuck in there. It’s easy to assume that nobody gave a damn, but that’s not true.</p>
<p>Everybody recognized these issues, everybody wanted and tried to solve them (in multiple occasions!), each in their own way, the only thing we lacked was a unified company-wide voice.</p>
<p>Now, after the changes you’re about to read, the mood is electrifying, everyone is firing on all cylinders and are happy to do so. We’re building a lot (and I mean A LOT) of cool new stuff.</p>
<p>So thank you colleagues, thank you for not giving up and for the amazing work culture that we managed to build.</p>
<p>Without further ado… <strong>it’s time to break some stuff!</strong></p>
<hr />
<h1>The shift: How to structure a complex project’s workload</h1>
<p>Each new feature was taking longer and longer to implement, slowing us down considerably with each new deployment, in the course of a couple of weeks we drafted a rough roadmap of what we wanted to do and presented it to the entire company, the pitch was simple yet crazy.</p>
<blockquote>
<p>“Let’s throw everything out, let’s recreate the platform from scratch” — we said, unified.</p>
</blockquote>
<p>We were given an opportunity that few tech teams had, we were given the green light to stop what we were doing and re-build the entire platform from scratch: new features, new UI, new code, new everything… the only thing that remained unchanged was the name.</p>
<h2>Finding our direction</h2>
<p>At the beginning of this <em>odyssey</em> we discussed how the platform was torn between two worlds: B2B and B2C. We had to make a decision of which one to prioritize, we went with the B2C in the first phase of the refactor. The company decided the features, and the tech team would give time estimates.</p>
<p>No longer were be beholden to the whims of the market, we were going to build our platform, from our ideas, with our philosophies.</p>
<h2>Plan, then act</h2>
<p>The first major change we applied was to the project management itself, we didn’t implement <em>re</em>-actively anymore, we now implemented <em>pro</em>-actively.</p>
<p>Each feature was proposed by the product designers in a rough document and it was then discussed with the tech team (where it was often reshaped, enriched and improved), after that the tech team would brainstorm possible implementations and come up with a technical document from which we wrote the tasks and give estimates back to the product design and project management team.</p>
<p>Every problem and feature would be broken down into multiple, self contained releases. Each release was easy to estimate and implement, no longer we had big tasks that would take entire weeks, we now had simple and well defined tasks and goals that could be brought to completion in (at most) a couple of days.</p>
<h3>Key takeaways</h3>
<ul>
<li><p>Trust your developers, their job isn’t to simply write code, but to find solutions, don’t treat them as the very last step of the implementation process</p>
</li>
<li><p>Include your developers straight from the ideation phase, not just when it’s time to build</p>
</li>
<li><p>Spend more time arguing back and forth at the beginning, ensuring smooth sailing once everything is decided</p>
</li>
<li><p>Document every decision, a lot of time can pass between planning and implementing, you want to make sure that everything is on the same page even a month from now</p>
</li>
</ul>
<h2>Documentation is not a “<em>time-waster</em>”</h2>
<p>Every discussion and every subsequent decision could not vanish into thin air, or be relegated to the memory currently working on a given project. Every time a choice was made we dedicated some time to extract more generic rules and guidelines that could be applied to similar decisions in the future.</p>
<blockquote>
<p>We decided to adopt a “<em>case-law</em>“ approach to decision making, similar to how lawyers build cases based on previous, similar ones.</p>
</blockquote>
<p>Doing this made every meeting a bit shorter than the one before, whilst unifying the tech team (and, as a result, the codebase itself) into a more cohesive and comprehensive whole.</p>
<h3>Key takeaways</h3>
<ul>
<li><p>Spending a lot of time at the beginning of a project writing documentation is a worth-while investment that facilitates both the current and future developments</p>
</li>
<li><p>Time spent to plan and to write documentation is not extra, is just as important as writing the code itself</p>
</li>
</ul>
<h2>Strict standards</h2>
<p>There’s no way to sugar-coat this one: once something is documented, you need to be strict about enforcing it. While the field of software development can involve a lot of artistry and creativity, you don’t want every developer to implement stuff in their own special way.</p>
<p>Spend time at the beginning of a project to define (not on your own, but with the rest of the team) software design principles and patterns, naming conventions, protocols, code-style guidelines, and everything in between, then enforce those standards with a strict review process before shipping the code to production.</p>
<h3>The process</h3>
<ol>
<li><p>Write your code and add or update feature/unit tests for it</p>
</li>
<li><p>Open a pull request (may have different names depending on your VCS)</p>
</li>
<li><p>Describe your changes inside the pull request</p>
</li>
<li><p>Let the automatic test-runners and lint-checkers go over your code</p>
</li>
<li><p>Add at least 2 fellow developers as reviewers</p>
</li>
<li><p>Make sure your branch is aligned with the destination branch</p>
</li>
<li><p>If needed, implement changes requested by the reviewers</p>
</li>
<li><p>Merge your code with the <code>squash</code> strategy (to collapse all commits into one)</p>
</li>
<li><p>Release in a safe environment for one last round of testing</p>
</li>
<li><p>Release in production</p>
</li>
</ol>
<h3>Key takeaways</h3>
<ul>
<li><p>A feature that works, but with unreadable code, is worse than no feature at all</p>
</li>
<li><p>Take your time in the review process, even on multiple rounds, there’s no rush to go live</p>
</li>
<li><p>If there is a rush to go live, mark your “<em>quick and dirty</em>” code and assign yourself a task to go back and beautify it later</p>
</li>
<li><p>If you find bad code (that works) make it compliant with the defined standards, following the “<em>boy-scout rule</em>“</p>
</li>
</ul>
<h1>The new platform: Software design principles and best-practices</h1>
<p>After more than a year of refactoring, rebuilding, redoing, re-everything-ing, we are now happy with our current codebase. Let’s now go over the key design decisions that made our code a joy to work with!</p>
<p>Keep in mind: these principles do not apply to a specific language or framework, however they ARE tailor-made for backend API-based web applications.</p>
<h2>Domain-Driven Design</h2>
<p>Every feature of our application is treated as if were an external plugin developed by entirely unknown people and each relegated to its <em>Domain</em>.</p>
<p>In the first phases of the refactor we separated domains into folders inside the same codebase to allow quick development:</p>
<pre><code class="language-bash">src/
    Core/
    Domains/
        Auth/
        Projects/
        Products/
        Payments/
# etc... 
</code></pre>
<p>Then, after each of those domains was solidified, we packaged and versioned them into a private registry so that the main application simply needs to install that package.</p>
<pre><code class="language-bash">package-manager install our-company/domain-name
</code></pre>
<p>Each domain needs to be built with the assumption that all others, except for the <code>Core</code> domain, do not even exist. Each domain must stand on it’s own.</p>
<p>Maybe we don’t even need <code>Auth</code> tomorrow because we’ll build a local-only version of our platform, maybe not, we don’t know and we don’t care.</p>
<blockquote>
<p>Apply the “<em>single responsibility principle</em>“.</p>
<p>Domains and components of the domain each do one specific thing, regardless of context.</p>
</blockquote>
<h3>Dependency injection between domains</h3>
<p>Each domain must have at least one so-called <em>Provider</em>, a piece of code that declares and (indeed) provides dependencies to be used by other domains. Each domain must use dependency-injection to use another domain’s components, it must never EVER instantiate components directly.</p>
<pre><code class="language-typescript">// src/Domains/Payments
class PaymentsProvider extends Core.Provider
{
    public function register(): void
    {
        this.add&lt;PaymentsInterface, PaymentsImplementation&gt;();
    }
}

// src/Domains/Plans
class PlanManager
{
    public function checkActivePlan(payments: PaymentsInterface): void
    {
        // other stuff...
        payments.unresolvedPayments();
        // other stuff...
    }
}
</code></pre>
<p>We want components to be swappable at any time without changing a single line in the rest of the codebase.</p>
<h2>Everything must be predictable</h2>
<ul>
<li><p>Functions:</p>
<ul>
<li><p>Must declare strongly typed arguments and return types</p>
</li>
<li><p>Must declare all the exceptions that COULD be thrown</p>
</li>
<li><p>If execution completes the result is considered valid, if not throw an exception. Don’t make the caller check for the validity of the result once returned, its not their responsibility</p>
</li>
</ul>
</li>
<li><p>Variables:</p>
<ul>
<li>Must be strongly-typed or at the very least type-hinted. The developer and whatever tools they’re using must be able to inspect what a variable is</li>
</ul>
</li>
</ul>
<h2>Layers and responsibilities</h2>
<p>Each domain is (usually) composed of 3 main layers, each with their own job.</p>
<h3>Database</h3>
<p>Were data is persisted and where consistency checks are made. The database layer does not care if things make sense from a business standpoint.</p>
<p>Let’s say, for example, that we decide that each user can have, at most, one project associated with them: in this case we build our database to make sure that the relation between users and projects exists but we do not enforce the described limit, we want this layer to be as open as possible, knowing that any limitations can be lifted in the future.</p>
<p>The less we update this layer, the better.</p>
<h3>Logic</h3>
<p>Here we only care about implementing the entities and actions, without checking if a particular user can or cannot perform it… actually, we don’t even concern ourselves with the concept of “user” here, just the raw logic wrapped inside atomic components that can be called from anywhere at any time in any context.</p>
<p>Each component of this layer requires the utmost care and rigorous unit testing.</p>
<p>When an action is called (be it a function or method) it either returns successfully or throws domain-specific and self-explanatory exceptions.</p>
<h3>Interaction and Presentation</h3>
<p>In the context of an HTTP-based API application, this is where we define our endpoints, validate requests and their payloads, check if the authenticated user can perform the desired action, and build responses.</p>
<p>This is just a wrapper for the <em>Logic</em> layer, where, once all the necessary checks are performed, we call upon it to perform the action and interpret its result (or its exception). More on that later</p>
<h2>Components</h2>
<p>Each component is a piece of code designed to perform a specific type of action. Here are the main ones we defined:</p>
<ul>
<li><p>Entity: a representation of a non-primitive piece of data, can be used by other domains</p>
</li>
<li><p>Repository: to store and retrieve data unconditionally and without complex logic, never called outside a service and cannot be used by other domains</p>
<ul>
<li><p>storing: an entity is given as an argument, it persists it to the database and returns the updated entity</p>
</li>
<li><p>fetching (one): returns the requested entity from the database or throws an exception if it cannot be found</p>
</li>
<li><p>fetching (list): returns a list with the requested entities from the database or an empty list if none can be found</p>
</li>
</ul>
</li>
<li><p>Service: to interact with a repository based (occasionally) on complex logic, can be used by other domains</p>
</li>
<li><p>Controller: to manage a specific API endpoint, perform user-based checks call services, and format responses, it NEVER contains complex logic, can only be used by external clients</p>
</li>
</ul>
<h2>Naming conventions</h2>
<ul>
<li><p>Casing</p>
<ul>
<li><p><code>camelCase</code> (lower) for variable and function names (i.e. <code>project = projectService.getProject()</code>)</p>
</li>
<li><p><code>camelCase</code> (upper) for class names (i.e. <code>ProjectService</code>)</p>
</li>
<li><p><code>snake_case</code> (lower) for raw data, like payload keys and values (i.e. <code>{"some_key": "some_value"}</code>)</p>
</li>
</ul>
</li>
<li><p>Always use the same word for the same action: if the piece of code that persists data to the database is called <code>storeSomething</code> in one place, then it must also be called <code>storeAnotherThing</code> elsewhere, the action is <code>store</code>, and is always <code>store</code></p>
</li>
<li><p>Self explanatory: while documenting your code is certainly recommended and encouraged making your variable, class and function names explain what they do makes everything more readable. Here are our designed function/variable prefixes:</p>
<ul>
<li><p><code>can</code>/<code>is</code>: return a boolean <code>true</code> if yes, always use positive language, never use <code>cant</code>/<code>isnt</code></p>
</li>
<li><p><code>check</code>/<code>validate</code>: return void if all checks pass, throws exception if not</p>
</li>
<li><p>just the action name: performs the action, can return any type of data, throws exception if it fails.</p>
</li>
</ul>
</li>
</ul>
<h2>Protocols (for HTTP requests and responses via JSON )</h2>
<p>The request and response payload share the same guidelines.</p>
<ul>
<li><p><code>snake_case</code> for the payload (as described in the naming conventions for raw data)</p>
</li>
<li><p><code>Train-Case</code> for headers (as defined in the HTTP standard)</p>
</li>
<li><p>an existing <code>null</code> key and an absent key are the same</p>
</li>
<li><p>keep it raw: let the clients do the interpreting and parsing (i.e. for dates we send the UNIX Epoch timestamp instead of a date string)</p>
</li>
<li><p>same entity, same structure</p>
</li>
</ul>
<h2>Wrapping up</h2>
<p>After doing all that (and way, waaay more) we now have a consistent and predictable codebase. Productivity has increased (making the managers happy) and the code is beautifully maintainable (making the developers happy)… It’s now time to take it to the next level!</p>
<h1>AI-Assisted Development (done right)</h1>
<p>Since they made their splash on the software market, my feelings on AI coding assistants were always mixed: on one hand the theoretical productivity boost is too good to ignore, on the other having a model generate code could and has lead to inconsistencies in many documented cases.</p>
<h2>Finding the right model</h2>
<p>After snooping around and experimenting with various models it became clear that the best coding agent, at the time of writing is <em>Claude Code</em>... but what do I mean by "perfect"?</p>
<p>Here's the criteria used to evaluate the quality of a coding companion:</p>
<ul>
<li><p>The underlying model must be un-opinionated (or as close as possible to it); no model is truly un-opinionated, but we found that ChatGPT and Copilot tended to follow in the same footsteps of similar projects that used the same framework as us, instead of following OUR standards</p>
</li>
<li><p>The agent's actions must be configurable</p>
</li>
<li><p>The agent must first generate a plan and then, only after authorization from the human user, it may start writing the actual code</p>
</li>
</ul>
<h2>Managing contribution scopes</h2>
<p>Every model has the same issue as of right now: as the context grows, the results lose consistency and quality.</p>
<p>This is why it's important to limit the work done per-request. Keep in mind that our codebase was already well-formed before we introduced our AI companions to help out, so we only employed them to implement additional features on an already robust and well-segmented codebase.</p>
<p>Every time a feature needs to be implemented we define a clear and limited scope, complete the generation and then log our decisions in our technical design documents. These documents are then read by the agent on the next iteration so it knows where to start from, keeping the context light and the quality high.</p>
<p>The most important rule is that the code being generated MUST be written the same way we would so, if at some point in the future we ditch our AI companions, we can still understand and navigate the code it generated.</p>
<h2>Creating the "<em>perfect</em>" companion</h2>
<p>Before making our AI companion start writing code, we defined a small fleet of <em>sub-agents</em>, each with its own goal and guidelines. For each code generation we make them collaborate and check each other's results to ensure that the code is written the way one of our developers would.</p>
<p>Some useful <em>sub-agents</em> we implemented are:</p>
<ul>
<li><p>documentation compliance checker: runs at the end of each generation to ensure that everything is done according to our documentation</p>
</li>
<li><p>domain expert: writes the scaffolding for new domains and informs the code writers on how to work on an existing one (folder structure, service + repository design pattern, providers, etc.)</p>
</li>
<li><p>coding standards enforcer: makes sure the code being written matches the coding standards, naming conventions and design patterns we declared</p>
</li>
<li><p>testing expert: writes and/or updates unit and feature tests for the features being implemented and makes sure the existing tests still pass</p>
</li>
<li><p>api validator: make sure that the endpoints being implemented follow RESTful and our own standards</p>
</li>
<li><p>etc.</p>
</li>
</ul>
<p>With these agents (and more) each generation goes as follows:</p>
<ol>
<li><p>A plan is drafted by interrogating domain and coding standards agents, included in the plan is also a list of which agent needs to be called and when</p>
</li>
<li><p>The plan is approved by a human user</p>
</li>
<li><p>A fleet of agents is run in parallel to implement the feature</p>
</li>
<li><p>Compliance, coding standard and test checks are ran by the relevant agents</p>
</li>
<li><p>The feature is sent for a final round of manual review by a human user</p>
</li>
<li><p>Done!</p>
</li>
</ol>
<p>The productivity boost this approach has granted our team is hard to overstate, it's NOT just vibe coding, its a strong workflow that allows us to treat our agents as a small team of qualified developers, who always follow OUR way of doing things, with hallucinations reduced to a minimum.</p>
<h1>Conclusion: Looking back, looking forward</h1>
<p>I feel like I took part in something rare, a company that is willing to put everything on hold for a year, even in troubled times, because it understands and trusts its developers to take their time and deliver a quality product is really hard to come by.</p>
<p>When I first joined I was frustrated at how things were managed both in code and in person, I wanted out… but something beckoned me to stay. I’m now sure that something was the group of people along side me, willing to doubt themselves and tread on unknown grounds, willing to build something great, simply… willing.</p>
<p>I, like everyone else in this world and especially in this line of work, don’t know what the future holds, but I’m ready to face it, to predict it, to build it, and to learn from it.</p>
<p>Thank you for sharing a bit of your time with me, I hope to ave made it worth your while.</p>
<hr />
<h1>Further reading</h1>
<ul>
<li><p><a href="https://www.goodreads.com/book/show/39996759-a-philosophy-of-software-design">Philosophy of Software Design</a></p>
</li>
<li><p><a href="https://blog.snisni.it/anti-patterns">An introduction to Anti-Patterns</a></p>
</li>
<li><p><a href="https://blog.snisni.it/writing-code-for-others">Writing code for others</a></p>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[The Giant List of useful resources]]></title><description><![CDATA[For the past 2 years I, and many others, have been using a lot of small tools, apps, and alike to support us during our development process.

I've taken some time to compile them and list them for you here.

I love talking with and meeting new people...]]></description><link>https://blog.snisni.it/the-giant-list-of-useful-resources</link><guid isPermaLink="true">https://blog.snisni.it/the-giant-list-of-useful-resources</guid><category><![CDATA[resources]]></category><category><![CDATA[Web Development]]></category><category><![CDATA[research]]></category><category><![CDATA[Software Engineering]]></category><category><![CDATA[software development]]></category><dc:creator><![CDATA[Mattia Sinisi]]></dc:creator><pubDate>Sat, 26 Mar 2022 13:14:32 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1648291259318/QcxVlmgcd.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>For the past 2 years I, and many others, have been using a lot of small tools, apps, and alike to support us during our development process.</p>
<blockquote>
<p>I've taken some time to compile them and list them for you here.</p>
</blockquote>
<p>I love talking with and meeting new people at conferences and workshops, a lot of what is listed below was discovered by talking with other <strong>passionate developers</strong>.</p>
<hr />
<h1 id="heading-the-list">The List</h1>
<p>Tools, apps, articles, tutorials, cheatsheets, components, assets, and more to aid developers and other online professionals in their work. Some of these are also useful to spice up your presentation and others are just cool. <strong>I'll let you discover them.</strong></p>
<ol>
<li><a target="_blank" href="https://mattboldt.com/demos/typed-js/">JavaScript Animated Typing with Typed.js | by Matt Boldt</a></li>
<li><a target="_blank" href="https://git.io/">git.io</a></li>
<li><a target="_blank" href="https://amp.dev/">AMP - a web component framework to easily create user-first web experiences - amp.dev</a></li>
<li><a target="_blank" href="https://www.markdownguide.org/basic-syntax">Basic Syntax | Markdown Guide</a></li>
<li><a target="_blank" href="https://www.nativescript.org/">Native mobile apps with Angular, Vue.js, TypeScript, JavaScript - NativeScript</a></li>
<li><a target="_blank" href="https://vuecomponents.com/">VueComponents</a></li>
<li><a target="_blank" href="https://www.svgbackgrounds.com/#flat-mountains">Create Customizable, Hi-Def, and Scalable Backgrounds</a></li>
<li><a target="_blank" href="https://framework7.io/">Framework7 - Full Featured Framework For Building iOS, Android &amp; Desktop Apps</a></li>
<li><a target="_blank" href="https://purifycss.online/">PurifyCSS Online - Remove unused CSS</a></li>
<li><a target="_blank" href="https://www.checklist.design/">Checklist Design</a></li>
<li><a target="_blank" href="https://keenthemes.com/metronic/">Metronic - The Most Popular Bootstrap 4 HTML, Angular 9, VueJS, React &amp; Laravel Admin Dashboard Theme</a></li>
<li><a target="_blank" href="https://www.danea.it/blog/come-fare-un-preventivo/#Modalita_di_pagamento">Come fare un preventivo perfetto in 10 punti, consigli e fac simile</a></li>
<li><a target="_blank" href="https://premium.wpmudev.org/blog/speeding-up-wordpress/">The Ultimate Mega Guide to Speeding Up WordPress</a></li>
<li><a target="_blank" href="https://infinityfree.net/">Free and Unlimited Web Hosting with PHP and MySQL - InfinityFree</a></li>
<li><a target="_blank" href="https://bit.dev/">The shared component cloud · Bit</a></li>
<li><a target="_blank" href="https://autocode.com/">Instant Webhooks, Scripts and APIs · Autocode</a></li>
<li><a target="_blank" href="https://mjml.io/">MJML - The Responsive Email Framework</a></li>
<li><a target="_blank" href="https://www.snowpack.dev/">Snowpack - The faster frontend build tool</a></li>
<li><a target="_blank" href="https://docs.docker.com/compose/production/">Use Compose in production | Docker Documentation</a></li>
<li><a target="_blank" href="https://jelastic.com/docker/">Docker Cloud Hosting | Jelastic</a></li>
<li><a target="_blank" href="https://www.storyscript.com/">Storyscript</a></li>
<li><a target="_blank" href="https://danielkummer.github.io/git-flow-cheatsheet/">Git Flow</a></li>
<li><a target="_blank" href="https://styleci.io/login/">StyleCI - The Web Coding Style Fixer</a></li>
<li><a target="_blank" href="https://php.watch/#read-more">php.watch</a></li>
<li><a target="_blank" href="https://generated.photos/">Generated Photos | Unique, worry-free model photos</a></li>
<li><a target="_blank" href="https://icons8.com/photos">Free People PNGs | Icons8</a></li>
<li><a target="_blank" href="https://www.codiceazienda.it/servizi/calcolo-inverso-ricevuta-autonomo-occasionale/">Calcolo Inverso Ricevuta Lavoro Autonomo Occasionale</a></li>
<li><a target="_blank" href="https://mybb.com/">MyBB - Free and Open Source Forum Software</a></li>
<li><a target="_blank" href="https://flarum.org/">Flarum</a></li>
<li><a target="_blank" href="https://www.awwwards.com/">Awwwards - Website Awards - Best Web Design Trends</a></li>
<li><a target="_blank" href="https://t.ly/home">T.LY | URL Shortener, Custom Domain &amp; Link Management</a></li>
<li><a target="_blank" href="https://instant.page/">instant.page</a></li>
<li><a target="_blank" href="https://termify.io/generate-privacy-policy">Termify | Generate Privacy Policy</a></li>
<li><a target="_blank" href="https://mdxjs.com/">MDX</a></li>
<li><a target="_blank" href="https://unifiedjs.com/">unified</a></li>
<li><a target="_blank" href="https://xkit.co/?rdt_cid=3030317228340885434&amp;utm_medium=cpc&amp;utm_source=reddit">The integration platform for developers – Xkit</a></li>
<li><a target="_blank" href="https://www.statista.com/">• Statista - The Statistics Portal for Market Data, Market Research and Market Studies</a></li>
<li><a target="_blank" href="https://generated.photos/#">Generated Photos | Unique, worry-free model photos</a></li>
<li><a target="_blank" href="https://vueformulate.com/">Vue Formulate ⚡️ The easiest way to build forms with Vue.js</a></li>
<li><a target="_blank" href="https://wiki.js.org/get-started">Wiki.js</a></li>
<li><a target="_blank" href="https://ohdear.app/">Monitor your entire website, not just the homepage. - Oh Dear</a></li>
<li><a target="_blank" href="https://parseplatform.org/">Parse - Create Application with Ease</a></li>
<li><a target="_blank" href="https://developer.wordpress.org/themes/advanced-topics/child-themes/">Child Themes | Theme Developer Handbook | WordPress Developer Resources</a></li>
<li><a target="_blank" href="https://docs.docker.com/engine/swarm/stack-deploy/">Deploy a stack to a swarm | Docker Documentation</a></li>
<li><a target="_blank" href="https://www.programiz.com/">Programiz: Learn to Code for Free</a></li>
<li><a target="_blank" href="https://www.revenuecat.com/">In-App Subscriptions Made Easy – RevenueCat</a></li>
<li><a target="_blank" href="https://storyset.com/">Download free illustrations to power up your projects | Storyset</a></li>
<li><a target="_blank" href="https://lottiefiles.com/">LottieFiles - Free animation files built for Lottie</a></li>
<li><a target="_blank" href="https://stepsconnect.com/">Steps</a></li>
<li><a target="_blank" href="https://www.deadlinkchecker.com/website-dead-link-checker.asp">Broken Link Checker Tool - Dead Link Checker</a></li>
<li><a target="_blank" href="https://artgrid.io/">Royalty Free Stock Footage - Artgrid.io</a></li>
<li><a target="_blank" href="https://www.streamlineicons.com/?utm_source=twitter&amp;utm_medium=cpc&amp;utm_campaign=Streamline%20Icons">Download 30,000 Free Icons. The World's Largest Icon Pack.</a></li>
<li><a target="_blank" href="https://toggl.com/">Toggl: Time Tracking, Project Planning and Hiring Tools to Help Teams Work Better</a></li>
<li><a target="_blank" href="https://babelnet.org/">BabelNet | Il più grande dizionario enciclopedico e rete semantica multilingue</a></li>
<li><a target="_blank" href="https://www.emailjs.com/">EmailJS</a></li>
<li><a target="_blank" href="https://dannjs.org/">Dannjs | Neural Network library for Javascript</a></li>
<li><a target="_blank" href="https://www.mongodb.com/">The most popular database for modern apps | MongoDB</a></li>
<li><a target="_blank" href="https://jerryscript.net/">JavaScript engine for Internet of Things</a></li>
<li><a target="_blank" href="https://blobs.app/">Blob Generator</a></li>
<li><a target="_blank" href="https://www.blobmaker.app/">Blobmaker - Make organic SVG shapes for your next design</a></li>
<li><a target="_blank" href="https://search.google.com/test/rich-results">Test dei risultati multimediali - Google Search Console</a></li>
<li><a target="_blank" href="https://letsenhance.io/">Let's Enhance – Image enhancement powered by AI</a></li>
<li><a target="_blank" href="https://plagiarismdetector.net/">Plagiarism Checker Free | Accurate with Percentage</a></li>
<li><a target="_blank" href="https://www.electronjs.org/">Electron | Build cross-platform desktop apps with JavaScript, HTML, and CSS.</a></li>
<li><a target="_blank" href="https://threejs.org/">Three.js – JavaScript 3D library</a></li>
<li><a target="_blank" href="https://sketchfab.com/3d-models?features=downloadable&amp;sort_by=-likeCount">Popular 3D models - Sketchfab</a></li>
<li><a target="_blank" href="https://availableon.badge.ptkdev.io/">"Available on" | Badge Generator</a></li>
<li><a target="_blank" href="https://modelviewer.dev/docs/index.html#loading-css"> Examples and Documentation</a></li>
<li><a target="_blank" href="https://carbon.now.sh/">Carbon | Create and share beautiful images of your source code</a></li>
<li><a target="_blank" href="https://feedshark.brainbliss.com/">Ping Blog, RSS Feed, or Podcast for Free with Feed Shark!</a></li>
<li><a target="_blank" href="https://objection.lol/">Ace Attorney Objection Maker</a></li>
<li><a target="_blank" href="https://www.videostudiopro.com/en/products/videostudio/pro/">Video Editing Software by Corel - VideoStudio Pro 2020</a></li>
<li><a target="_blank" href="https://svbtle.com/">Svbtle</a></li>
<li><a target="_blank" href="https://docs.moodle.org/310/en/Using_TeX_Notation#Greek_Letters">Using TeX Notation - MoodleDocs</a></li>
<li><a target="_blank" href="https://commento.io/">Commento: Home</a></li>
<li><a target="_blank" href="https://learntocodewith.me/posts/tech-gifts/">105+ Best Tech Gifts for Programmers, Coders, and Techies 2021 | Gift Ideas by Learn to Code With Me</a></li>
<li><a target="_blank" href="https://coolbackgrounds.io/">Cool Backgrounds</a></li>
<li><a target="_blank" href="https://svgeneration.netlify.app/recipes/aura/">SVGeneration</a></li>
<li><a target="_blank" href="https://svgeez.com/">SVGeez - Free customizable SVG background patterns | Home</a></li>
<li><a target="_blank" href="https://tap.bio/@tap.bio">Tap Bio</a></li>
<li><a target="_blank" href="https://vitejs.dev/">Vite</a></li>
<li><a target="_blank" href="https://hotwire.dev/">HTML Over The Wire | Hotwire</a></li>
<li><a target="_blank" href="https://zenpen.io/">ZenPen ~ Minimal Distraction, Maximum Zen</a></li>
<li><a target="_blank" href="https://treeware.earth/">Treeware, software distribution supporting a sustainable future.</a></li>
<li><a target="_blank" href="https://responsively.app/?fbclid=IwAR1AgHjyyTmhYsgT2_Murb9ilvJ3AKxLnvxpKBfrBVgbpglH39OztI7ALSw">A Web Developer's Browser | Responsively App</a></li>
<li><a target="_blank" href="https://permission.site/">Test Permissions</a></li>
<li><a target="_blank" href="https://loading.io/">loading.io - Your SVG + GIF + PNG Ajax Loading Icons and Animation Generator</a></li>
<li><a target="_blank" href="https://contrib.rocks/preview?repo=thedevelopertoolbox%2Fthedevelopertoolbox.github.io">Contributors in README</a></li>
<li><a target="_blank" href="https://twill.io/docs/#contribution-guide">Documentation – Twill</a></li>
<li><a target="_blank" href="https://quilljs.com/">Quill - Your powerful rich text editor</a></li>
<li><a target="_blank" href="https://icons8.com/line-awesome">Line Awesome — Free Beautiful Icon Font</a></li>
<li><a target="_blank" href="https://gradle.org/">Gradle</a></li>
<li><a target="_blank" href="https://deno.com/deploy">Deno Deploy</a></li>
<li><a target="_blank" href="https://super.so/">Super — From Notion to Website in minutes</a></li>
<li><a target="_blank" href="https://fruitionsite.com/">Fruition: Free, Open Source Toolkit for Building Websites with Notion</a></li>
<li><a target="_blank" href="https://pinia.esm.dev/">Pinia</a></li>
<li><a target="_blank" href="https://www.osohq.com/?utm_source=tldrnewsletter">Oso - Batteries-Included Authorization</a></li>
<li><a target="_blank" href="https://starship.rs/">Starship: Cross-Shell Prompt</a></li>
<li><a target="_blank" href="https://crontab.guru/">Crontab.guru - The cron schedule expression editor</a></li>
<li><a target="_blank" href="https://itty.bitty.site/">itty.bitty.site</a></li>
<li><a target="_blank" href="https://emoji.supply/">Emoji Wallpaper</a></li>
<li><a target="_blank" href="https://manytools.org/facebook-twitter/ascii-banner-2/">Create WhatsApp/Telegram ASCII text banners online</a></li>
<li><a target="_blank" href="http://shorby.com/">SHORBY</a></li>
<li><a target="_blank" href="https://tailwindcomponents.com/">Tailwind CSS Components. Examples and templates</a></li>
<li><a target="_blank" href="https://usedevbook.com/">Devbook - Search Engine for Developers</a></li>
<li><a target="_blank" href="https://primer.style/css/">Primer CSS - The CSS framework that GitHub uses</a></li>
<li><a target="_blank" href="https://ipinfo.io/">Comprehensive IP address data, IP geolocation API and database - IPinfo.io</a></li>
<li><a target="_blank" href="https://heroicons.com/">Heroicons</a></li>
<li><a target="_blank" href="https://www.imgix.com/">Image processing and manipulation API - Image CDN • imgix</a></li>
<li><a target="_blank" href="https://ecosystem.laravel.io/">Laravel Ecosystem</a></li>
<li><a target="_blank" href="https://blade-ui-kit.com/">Blade UI Kit</a></li>
<li><a target="_blank" href="https://www.apideck.com/">API integration (re)defined | Apideck</a></li>
<li><a target="_blank" href="https://www.apideck.com/products/ecosystem">Apideck Ecosystem - Integration marketplaces and pages for SaaS companies. Easy to set up, no direct integration needed. | Apideck</a></li>
<li><a target="_blank" href="https://sitejs.org/">Site.js</a></li>
<li><a target="_blank" href="https://poser.pugx.org/">Badge Poser, badges for PHP</a></li>
<li><a target="_blank" href="https://makefiletutorial.com/#default-shell">Makefile Tutorial By Example</a></li>
<li><a target="_blank" href="https://opensource.guide/">Open Source Guides | Learn how to launch and grow your project.</a></li>
<li><a target="_blank" href="https://docs.minicli.dev/en/latest/">Minimal CLI application framework in PHP</a></li>
<li><a target="_blank" href="https://github-contributions.vercel.app/">GitHub Contributions Chart Generator</a></li>
<li><a target="_blank" href="http://image.intervention.io/use/url">Intervention Image - Url</a></li>
<li><a target="_blank" href="https://github.com/splitsh/lite">Split a repository to standalone sub-repositories</a></li>
<li><a target="_blank" href="https://threed.io/">Threed.io - Generate custom 3D Device Mockups.</a></li>
<li><a target="_blank" href="https://bgjar.com/">BGJar | Free svg background image generator for your websites</a></li>
<li><a target="_blank" href="https://www.meteor.com/">Meteor: Full-Stack + Mobile apps with JS</a></li>
<li><a target="_blank" href="https://umami.is/">umami - self-hosted website analytics</a></li>
<li><a target="_blank" href="https://www.kenney.nl/">Kenney • Free Game Assets</a></li>
<li><a target="_blank" href="https://awesomejs.dev/">Awesome JS</a></li>
<li><a target="_blank" href="https://sli.dev/">sli.dev - Presentations for developers</a></li>
<li><a target="_blank" href="https://owncast.online/">Home | Owncast</a></li>
<li><a target="_blank" href="https://www.30secondsofcode.org/">30 seconds of code</a></li>
<li><a target="_blank" href="https://bootstrap-table.com/">Bootstrap Table · An extended table to the integration with some of the most widely used CSS frameworks. (Supports Bootstrap, Semantic UI, Bulma, Material Design, Foundation)</a></li>
<li><a target="_blank" href="https://www.thinkwithgoogle.com/intl/it-it/feature/testmysite/">Confronta la velocità del tuo sito per dispositivi mobili</a></li>
<li><a target="_blank" href="https://www.11ty.dev/">Eleventy is a simpler static site generator.</a></li>
<li><a target="_blank" href="https://forestry.io/">Git-based CMS for Hugo, Next.js, Gatsby, Jekyll, Nuxt.js, Hexo, Eleventy, Docusaurus, Gridsome and more. | Forestry.io</a></li>
<li><a target="_blank" href="https://devprotocol.xyz/">Dev Protocol</a></li>
<li><a target="_blank" href="https://serversideup.net/">Quality tutorials &amp; resources. No BS. - Server Side Up</a></li>
<li><a target="_blank" href="https://swiperjs.com/">Swiper - The Most Modern Mobile Touch Slider</a></li>
<li><a target="_blank" href="https://badgen.net/#bundlephobia">Badgen - Fast badge generating service</a></li>
<li><a target="_blank" href="https://sumo.com/">Sumo: The #1 FREE email capture tool</a></li>
<li><a target="_blank" href="https://www.nerdfonts.com/">Nerd Fonts - Iconic font aggregator, glyphs/icons collection, &amp; fonts patcher</a></li>
<li><a target="_blank" href="https://listmonk.app/">listmonk - Free and open source self-hosted newsletter and mailing list manager</a></li>
<li><a target="_blank" href="https://stryker-mutator.io/">Stryker Mutator</a></li>
<li><a target="_blank" href="https://sourcemaking.com/">Design Patterns &amp; Refactoring</a></li>
<li><a target="_blank" href="https://www.forem.com/">Forem · For empowering community</a></li>
<li><a target="_blank" href="https://handsfree.dev/">Handsfree.js</a></li>
<li><a target="_blank" href="https://crowdin.com/">Localization Management Platform for agile teams | Crowdin</a></li>
<li><a target="_blank" href="https://www.getresponse.com/it?_ga=2.77969687.2056573056.1623666492-1581660600.1623666492&amp;lang=it">GetResponse | Online Email Marketing Software All-in-One</a></li>
<li><a target="_blank" href="https://cronitor.io/">Cron Monitoring &amp; Uptime Monitoring for Busy Developers - Cronitor</a></li>
<li><a target="_blank" href="https://astro.build/">Astro</a></li>
<li><a target="_blank" href="https://css-tricks.com/targetblank/">target=blank | CSS-Tricks</a></li>
<li><a target="_blank" href="https://copilot.github.com/?utm_source=tldrnewsletter">GitHub Copilot · Your AI pair programmer</a></li>
<li><a target="_blank" href="https://oeis.org/wiki/List_of_LaTeX_mathematical_symbols">List of LaTeX mathematical symbols - OeisWiki</a></li>
<li><a target="_blank" href="https://app.haikei.app/">Haikei - Simple SVG design</a></li>
<li><a target="_blank" href="https://www.editorx.com/">EditorX</a></li>
<li><a target="_blank" href="https://splidejs.com/">Splide – Free, lightweight and powerful JavaScript slider</a></li>
<li><a target="_blank" href="https://kool.dev/">kool.dev</a></li>
<li><a target="_blank" href="https://kaboomjs.com/">KaBoom!!! - JavaScript Game Library</a></li>
<li><a target="_blank" href="https://smooth.ie/blogs/news/svg-wavey-transitions-between-sections">Quick SVG Wave editor</a></li>
<li><a target="_blank" href="https://robotframework.org/">Robot Framework</a></li>
<li><a target="_blank" href="https://www.carbonads.net/">Reach Designers and Developers at Scale | Carbon Ads</a></li>
<li><a target="_blank" href="https://appwrite.io/">Appwrite - Open-Source End-to-End Backend Server</a></li>
<li><a target="_blank" href="https://trackingjs.com/">tracking.js</a></li>
<li><a target="_blank" href="https://dockerize.io/">Docker cloud hosting. Cheap, simple and fast to deploy and manage</a></li>
<li><a target="_blank" href="https://pipeless.io/">Pipeless | Recommendations and Activity Feeds API</a></li>
<li><a target="_blank" href="https://magic.link/">Magic: Future-proof passwordless authentication</a></li>
<li><a target="_blank" href="https://www.btw.so/">btw</a></li>
<li><a target="_blank" href="https://lavalite.org/">Laravel CMS and Admin framework. - Lavalite</a></li>
<li><a target="_blank" href="https://storybook.js.org/">Storybook: UI component explorer for frontend developers</a></li>
<li><a target="_blank" href="https://allcontributors.org/">All Contributors: ✨ Recognize all contributors, not just the ones who push code ✨</a></li>
<li><a target="_blank" href="https://esbuild.github.io/">esbuild - An extremely fast JavaScript bundler</a></li>
<li><a target="_blank" href="https://semantic-release.gitbook.io/semantic-release/">Fully automated version management and package publishing</a></li>
<li><a target="_blank" href="https://plausible.io/">Plausible Analytics</a></li>
<li><a target="_blank" href="https://www.sniptt.com/">The secret manager built for developers | Sniptt</a></li>
<li><a target="_blank" href="https://webpagetest.org/">WebPageTest - Website Performance and Optimization Test</a></li>
<li><a target="_blank" href="https://leafletjs.com/">Leaflet - a JavaScript library for interactive maps</a></li>
<li><a target="_blank" href="https://www.elegantthemes.com/gallery/divi/">Divi — The Ultimate WordPress Theme &amp; Visual Page Builder</a></li>
<li><a target="_blank" href="https://search.brave.com/">Brave Search</a></li>
<li><a target="_blank" href="https://startpage.com/">Startpage - Private Search Engine. No Tracking. No Search History.</a></li>
<li><a target="_blank" href="https://gun.eco/">GUN — the database for freedom fighters - Docs v2.0</a></li>
<li><a target="_blank" href="https://gulpjs.com/">gulp.js</a></li>
<li><a target="_blank" href="https://markjs.io/">mark.js – JavaScript keyword highlight</a></li>
<li><a target="_blank" href="https://glean.software/">Glean | System for collecting, deriving and querying facts about source code</a></li>
<li><a target="_blank" href="https://nocodb.com/">NocoDB | Turns your SQL database into a Nocode platform. Free &amp; Open Source.</a></li>
<li><a target="_blank" href="https://milkdown.dev/#/">Milkdown</a></li>
<li><a target="_blank" href="https://thispersondoesnotexist.com/">This Person Does Not Exist</a></li>
<li><a target="_blank" href="https://jwt.io/">JSON Web Tokens - jwt.io</a></li>
<li><a target="_blank" href="https://libera.chat/">Libera Chat | A next-generation IRC network for FOSS projects collaboration!</a></li>
<li><a target="_blank" href="https://deno.com/deploy/">Deno Deploy</a></li>
<li><a target="_blank" href="https://motion.dev/">Motion - Animation Library</a></li>
<li><a target="_blank" href="https://vscode.dev/">Get Started - default (Workspace) - Visual Studio Code</a></li>
<li><a target="_blank" href="https://www.bigcartel.com/">Big Cartel - Easy Online Stores for Artists and Makers</a></li>
<li><a target="_blank" href="https://uberduck.ai/">Uberduck</a></li>
<li><a target="_blank" href="https://webmonetization.org/">Web Monetization</a></li>
<li><a target="_blank" href="https://teta.so/">Teta - Build an app in a weekend, collaborating real time.</a></li>
<li><a target="_blank" href="https://fullstackhero.net/">fullstackhero - Open-Source Boilerplates for Modern Web Applications</a></li>
<li><a target="_blank" href="https://earthly.dev/">Earthly - Better Builds</a></li>
<li><a target="_blank" href="https://www-punto--informatico-it.cdn.ampproject.org/v/s/www.punto-informatico.it/kensington-verimark-pro-la-massima-sicurezza-a-portata-di-dito/?amp=&amp;amp_gsa=1&amp;amp_js_v=a6&amp;usqp=mq331AQIKAGwASCAAgM%3D#amp_tf=Da%20%251%24s&amp;aoh=16384721381781&amp;csi=0&amp;referrer=https%3A%2F%2Fwww.google.com&amp;ampshare=https%3A%2F%2Fwww.punto-informatico.it%2Fkensington-verimark-pro-la-massima-sicurezza-a-portata-di-dito%2F">Kensington VeriMark Pro: la massima sicurezza a portata di dito</a></li>
<li><a target="_blank" href="https://www.integromat.com/en/integrations/calendly/contact-form-seven/typeform">Contact Form 7, Calendly, Typeform Integrations | Integromat</a></li>
<li><a target="_blank" href="https://www.framer.com/sites/">Framer: Design beautiful websites in minutes</a></li>
<li><a target="_blank" href="https://intab.io/">InTab - Style websites faster</a></li>
<li><a target="_blank" href="https://parcelsapp.com/en">Universal Parcel Tracking - Global Package Tracking</a></li>
<li><a target="_blank" href="https://www.visiwig.com/">VISIWIG: click + paste graphics</a></li>
<li><a target="_blank" href="https://temp-mail.org/en/">Temp Mail - Disposable Temporary Email</a></li>
<li><a target="_blank" href="https://www.synthesia.io/">Synthesia - AI Video Generation Platform</a></li>
<li><a target="_blank" href="https://codeadrian.github.io/clay.css/">clay.css - by Adrian Bece</a></li>
<li><a target="_blank" href="https://icons8.com/illustrations">Free Vector Illustrations for Your Website - OUCH! - Icons8</a></li>
<li><a target="_blank" href="https://lingojam.com/WeirdTextGenerator">Weird Text Generator ― LingoJam</a></li>
<li><a target="_blank" href="https://obsidian.md/">Obsidian</a></li>
<li><a target="_blank" href="https://www.notionmaps.com/">Notion Maps</a></li>
<li><a target="_blank" href="https://substack.com/">Substack - Start a paid newsletter</a></li>
<li><a target="_blank" href="https://www.curated.co/">Curated</a></li>
<li><a target="_blank" href="https://rock.so/">Rock: Bring order to chaos</a></li>
<li><a target="_blank" href="https://polyhaven.com/">Poly Haven</a></li>
<li><a target="_blank" href="https://www.appflowy.io/">AppFlowy - Notion but Open Source</a></li>
<li><a target="_blank" href="https://uibakery.io/regex-library">RegEx Library</a></li>
<li><a target="_blank" href="https://soketi.app/">soketi - realtime server</a></li>
<li><a target="_blank" href="https://dahliaos.io/">dahliaOS – Home</a></li>
<li><a target="_blank" href="https://postgrest.org/en/stable/">PostgREST Documentation — PostgREST 9.0.0 documentation</a></li>
<li><a target="_blank" href="https://kod.so/">kod.so - Beautiful Code Screenshots</a></li>
<li><a target="_blank" href="https://manropefont.com/">Manrope – free sans-serif variable font</a></li>
<li><a target="_blank" href="https://www.prisma.io/">Prisma - Next-generation Node.js and TypeScript ORM for Databases</a></li>
<li><a target="_blank" href="https://pitch.com/">Pitch | Collaborative presentation software for modern teams</a></li>
<li><a target="_blank" href="https://vincit.github.io/objection.js/">Objection.js</a></li>
<li><a target="_blank" href="https://www.sanity.io/">The Unified Content Platform - Sanity.io</a></li>
<li><a target="_blank" href="https://bubble.io/">The best way to build web apps without code | Bubble</a></li>
<li><a target="_blank" href="https://contabo.com/en/">Contabo 🥇 Quality VPS &amp; Dedicated Servers At Incredible Prices 🥇</a></li>
<li><a target="_blank" href="https://fako.microkit.co/">Fako - Fake Data Generator</a></li>
<li><a target="_blank" href="https://microkit.co/">Microkit</a></li>
<li><a target="_blank" href="https://getstream.io/">Scalable Feeds &amp; Chat - Powerful APIs and Components by Stream</a></li>
<li><a target="_blank" href="https://floating-ui.com/">Floating UI - Positioning for tooltips, popovers, dropdowns, and more</a></li>
<li><a target="_blank" href="https://www.createbetter.xyz/?ref=producthunt">Create Better | A resource database to help you create and launch digital products.</a></li>
<li><a target="_blank" href="https://www.medusajs.com/">Medusa: Open Source Shopify alternative</a></li>
<li><a target="_blank" href="https://ui.dev/">ui.dev | Where ambitious developers learn together</a></li>
<li><a target="_blank" href="https://bytes.dev/">Bytes - The Best JavaScript Newsletter</a></li>
<li><a target="_blank" href="https://remix.run/">Remix - Build Better Websites</a></li>
</ol>
<h2 id="heading-special-mentions">Special mentions</h2>
<p>This next tool was suggested to me <strong>by its creator after</strong> the publication of this article, in fact, this paragraph has been added afterward.</p>
<p><strong>The opinions I'm about to express are my own and no one else's.</strong></p>
<p>The tool in question is <a target="_blank" href="https://www.experte.com/pagespeed">Bulk Page Speed Test</a> and, by its name alone, you already understood why it's so useful. The loading and crawling speed is amazing, you could test your whole site in under a minute (depending on its size, of course), truly an amazing tool!</p>
<h2 id="heading-the-end">The End</h2>
<p>Wow! You made it! <em>Y-you didn't just skip through right?</em></p>
<p>Anyhow, if you enjoy this type of stuff I can post a new edition with new stuff I discover or that is linked below in the comments. *wink wink*</p>
<p><em>Thanks for reading!</em> 😁</p>
]]></content:encoded></item><item><title><![CDATA[How to automatically map JSON data to a TypeScript object]]></title><description><![CDATA[Introduction
Interacting with JSON APIs, files, configs, etc. doesn't have to be such a hassle. Keeping your code clean and maintainable can be difficult when using loosely-typed data that can change at any time and, as I've talked about in my previo...]]></description><link>https://blog.snisni.it/how-to-automatically-map-json-data-to-a-typescript-object</link><guid isPermaLink="true">https://blog.snisni.it/how-to-automatically-map-json-data-to-a-typescript-object</guid><category><![CDATA[TypeScript]]></category><category><![CDATA[JavaScript]]></category><category><![CDATA[APIs]]></category><category><![CDATA[automation]]></category><dc:creator><![CDATA[Mattia Sinisi]]></dc:creator><pubDate>Wed, 20 Oct 2021 10:20:00 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1632295482139/JoGRvoq0T.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1 id="introduction">Introduction</h1>
<p>Interacting with JSON APIs, files, configs, etc. doesn't have to be such a hassle. Keeping your code <em>clean and maintainable</em> can be difficult when using loosely-typed data that can change at any time and, as I've talked about in my previous article about  <a target="_blank" href="https://blog.mattia.codes/anti-patterns">Anti-Pattens</a>, it introduces a lot of hard-coded logic in more than one place.</p>
<h1 id="the-situation">The situation 🤔</h1>
<p>Let's say that we need to map some JSON data to our TypeScript class.
The incoming data looks like this:</p>
<pre><code class="lang-json">{
    <span class="hljs-attr">"_param_1"</span>: <span class="hljs-string">"something"</span>,
    <span class="hljs-attr">"param2"</span>: <span class="hljs-string">"something else"</span>,
    <span class="hljs-attr">"items"</span>: [<span class="hljs-string">"item 1"</span>, <span class="hljs-string">"item 2"</span>, <span class="hljs-string">"item 3"</span>],
    <span class="hljs-attr">"something"</span>: {
        <span class="hljs-attr">"inner1"</span>: <span class="hljs-string">"inner thing"</span>,
        <span class="hljs-attr">"inner2"</span>: <span class="hljs-string">"another inner thing"</span>
    },
    <span class="hljs-attr">"thingToBeIgnored"</span>: <span class="hljs-string">"some useless data"</span>
}
</code></pre>
<p>While our class looks like this:</p>
<pre><code class="lang-typescript"><span class="hljs-keyword">class</span> TestClass {
    <span class="hljs-keyword">public</span> param1: <span class="hljs-built_in">string</span>;
    <span class="hljs-keyword">public</span> param2: <span class="hljs-built_in">string</span>;
    <span class="hljs-keyword">public</span> list: <span class="hljs-built_in">string</span>[];
    <span class="hljs-keyword">public</span> thing: AnotherClass;
    <span class="hljs-keyword">public</span> thingToBeIgnored: <span class="hljs-built_in">string</span> = <span class="hljs-string">"Leave me here!"</span>
}
</code></pre>
<p>How do we go about mapping one to another?</p>
<h2 id="the-bad-way">The bad way 😑</h2>
<p>Of course, the most cumbersome (and most used) way of doing it looks something like this:</p>
<pre><code class="lang-typescript"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">mapToClass</span>(<span class="hljs-params">json: <span class="hljs-built_in">any</span></span>) : <span class="hljs-title">TestClass</span> </span>{
    <span class="hljs-keyword">const</span> result = <span class="hljs-keyword">new</span> TestClass();
     result.param1 = json[<span class="hljs-string">"_param_1"</span>];
    result.param2 = json.param2;
    <span class="hljs-comment">// ...ok I think you get the picture.</span>
}
</code></pre>
<p>Doing it in other ways <strong>will NOT ensure a <em>true instance</em> of our class</strong>.</p>
<h1 id="the-one-line-alternative">The ONE-LINE alternative ✨</h1>
<p>For this we will need <strong> <a target="_blank" href="https://tapi.js.org">tapi.js</a> </strong>, a tiny, zero-dependency, auto-mapper for TypeScript.</p>
<pre><code class="lang-sh">npm i -S tapi.js
</code></pre>
<p>Next, be sure to <strong>enable decorators</strong> in your <code>tsconfig.json</code> file.</p>
<pre><code class="lang-json"><span class="hljs-string">"compilerOptions"</span> : {
    <span class="hljs-attr">"experimentalDecorators"</span>: <span class="hljs-literal">true</span>
}
</code></pre>
<p>Now, let's <strong>decorate 🌹</strong> our class and make it buildable. In our case it looks something like the following, however you can <a target="_blank" href="https://tapi.js.org/docs">read the docs</a>  to better understand the process.</p>
<pre><code class="lang-typescript"><span class="hljs-keyword">import</span> { BuildableResource, Properties } <span class="hljs-keyword">from</span> <span class="hljs-string">"tapi.js"</span>;

<span class="hljs-meta">@Properties</span>.Resource
<span class="hljs-keyword">class</span> TestClass <span class="hljs-keyword">extends</span> BuildableResource {
    <span class="hljs-meta">@Properties</span>.Alias(<span class="hljs-string">"_param_1"</span>)
    <span class="hljs-keyword">public</span> param1: <span class="hljs-built_in">string</span>;

    <span class="hljs-meta">@Properties</span>.Transform(<span class="hljs-function"><span class="hljs-params">incomingValue</span> =&gt;</span> {
        <span class="hljs-keyword">return</span> incomingValue.toUpperCase();
    })
    <span class="hljs-keyword">public</span> param2: <span class="hljs-built_in">string</span>;

    <span class="hljs-meta">@Properties</span>.ListOf(<span class="hljs-built_in">string</span>)
    <span class="hljs-keyword">public</span> list: <span class="hljs-built_in">string</span>[];

    <span class="hljs-keyword">public</span> thing: AnotherClass;

    <span class="hljs-meta">@Properties</span>.Ignore
    <span class="hljs-keyword">public</span> thingToBeIgnored: <span class="hljs-built_in">string</span> = <span class="hljs-string">"Leave me here!"</span>
}
</code></pre>
<h1 id="lets-convert">Let's convert! 😍</h1>
<p>Now your conversion happens automatically... <strong>in both ways</strong> and <strong>respecting the original formatting of the JSON data</strong>!</p>
<h3 id="from-json-to-class">From JSON to class</h3>
<pre><code class="lang-typescript"><span class="hljs-keyword">let</span> instance = <span class="hljs-keyword">new</span> TestClass().fromJSON(data);
</code></pre>
<h3 id="from-class-to-json">From class to JSON</h3>
<pre><code class="lang-typescript"><span class="hljs-keyword">let</span> data = instance.toJSON();
</code></pre>
<h1 id="mapping-from-promises">Mapping from promises 🤞</h1>
<p>Wanna use it with promises? Simple!</p>
<pre><code class="lang-typescript"><span class="hljs-keyword">import</span> axios <span class="hljs-keyword">from</span> <span class="hljs-string">'axios'</span> <span class="hljs-comment">// 👈 Of course, you can use whatever library you want</span>

<span class="hljs-keyword">import</span> { BuildableResource, ... } <span class="hljs-keyword">from</span> <span class="hljs-string">'tapi.js'</span>

<span class="hljs-keyword">import</span> <span class="hljs-string">'tapi.js/extensions'</span> <span class="hljs-comment">// 👈 Use this line to import all the extended functionalities of core types</span>

<span class="hljs-comment">// Let's create a simple class...</span>
<span class="hljs-keyword">class</span> TestClass <span class="hljs-keyword">extends</span> BuildableResource {
    <span class="hljs-comment">// You know the drill by now...</span>
}

<span class="hljs-comment">// Then make a request and get a promise...</span>
axios.get(<span class="hljs-string">'/some-url-that-returns-an-object'</span>)
    <span class="hljs-comment">// Now let's build the object with its defined builder! 🎉</span>
    .as(TestClass)
    <span class="hljs-comment">// Aaaaand we can use the typed object to do whatever we want.</span>
    .then(<span class="hljs-function">(<span class="hljs-params">builtObject</span>) =&gt;</span> {
        builtObject.doSomething();
    })
</code></pre>
<h1 id="conclusion">Conclusion</h1>
<p>I hope this article and this tool is helpful to you in some way, I'm actually the author of the NPM package and would love four you to try it and give me some feedback.</p>
<p>I've used it in a lot of projects and can assure you that it works... but don't take MY word for it, take YOURS!</p>
<p>Until next time! 👋</p>
]]></content:encoded></item><item><title><![CDATA[Anti-Patterns]]></title><description><![CDATA[For about a year I've been working in a bigger company than the startups I was used to. Suffice it to say, there's a lot of new lessons I've learned that I want to share with you. Working with experienced developers taught me how much a supposedly "c...]]></description><link>https://blog.snisni.it/anti-patterns</link><guid isPermaLink="true">https://blog.snisni.it/anti-patterns</guid><category><![CDATA[design patterns]]></category><category><![CDATA[Startups]]></category><category><![CDATA[Programming Tips]]></category><category><![CDATA[Productivity]]></category><category><![CDATA[General Programming]]></category><dc:creator><![CDATA[Mattia Sinisi]]></dc:creator><pubDate>Tue, 21 Sep 2021 12:57:19 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1622981965080/4jov40VMh.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>For about a year I've been working in a bigger company than the startups I was used to. Suffice it to say, there's a lot of new lessons I've learned that I want to share with you. Working with experienced developers taught me how much a supposedly "<em>clean</em>" solution can fully reveal itself as a pain in the ass during the final steps of a project.</p>
<p>These are what developers and engineers refer to as "<strong>Anti-Patterns</strong>".</p>
<h1 id="a-wolf-in-sheeps-clothing">A wolf in sheep's clothing</h1>
<p>I'm using this overly dramatic title to illustrate a key concept: an anti-pattern may seem like a good idea, an optimization, not unlike its benevolent counterpart the <em>design</em>-pattern... however it's actually ruining your future progress and will make you lose a lot of time in case your project needs a new feature.</p>
<p>The following article will explain the most common anti-patterns and how to avoid them.</p>
<p>Some of these are mistakes I've made and trust me... they're not pretty, especially when close to the deadline.</p>
<h2 id="optimizing-too-early">Optimizing too early</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1625053538900/SpRx_N3GJ.gif" alt="Early optimization - Solid structures" /></p>
<h3 id="what-is-it">What is it?</h3>
<p>This could quite possibly be the most important out of all the other ones, that's why I put it before all the other ones. Keep in mind that, in this case, the word <em>optimizing</em> is used for both execution speed and code cleanliness optimization.</p>
<p>Most developers like to build a solid structure (that covers most, if not all, use cases) before tackling the actual problem, almost like a mini-framework just for the project.</p>
<p>This, when done correctly, often leads to a cleaner codebase and faster development times... however, it's not a foolproof strategy.</p>
<h3 id="why-is-it-bad">Why is it bad?</h3>
<p>The thing about solid structures, though, is that <strong>they're really hard to move</strong>.</p>
<blockquote>
<p>Optimizing early in the process can lead you to be restricted by your own code.</p>
</blockquote>
<p>What I mean is that it can lead you to have a confusing codebase with little to no room for improvement. In the best of cases, you would have to re-write big chunks of code just to make a smaller adjustment just before you didn't consider it while building that initial structure.</p>
<h3 id="the-solution">The solution</h3>
<p>The best way to go about optimizing your code is to finish writing a working implementation first, and optimizing it after all the edge cases have been tested and addressed.</p>
<p>Just like a tattoo, you need to be <strong>really sure</strong> of it.</p>
<h2 id="magic-numbers">Magic numbers</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1625053932961/Oy4ewntcs.png" alt="Magic Numbers" /></p>
<h3 id="what-is-it">What is it?</h3>
<p>This refers to the seemingly innocent practice of putting string literals or number directly in your code. Of course, this is the most common and most forgivable anti-pattern, it's almost inevitable if you think about it.</p>
<h3 id="why-is-it-bad">Why is it bad?</h3>
<p>However, remember what I said before, anti-patterns <strong>look</strong> innocent, but aren't. Putting data and code together means what you'll have to rebuild and redeploy your entire application every time you want to tweak one of these values.</p>
<p>See? The general rule of thumb should be <strong>never hard code anything... ever</strong>.</p>
<h3 id="the-solution">The solution</h3>
<p>Make at least 99.9% of your variables configurable externally, most applications use <code>.ini</code>, <code>.json</code>, <code>.yml</code> or even a simple text files to store these values. Any solution could work, even using an external database (although I wouldn't recommend this one).</p>
<h2 id="re-implementation-hell">Re-implementation Hell</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1625054446450/5HaJaPtvq.png" alt="Re-implementation" /></p>
<h3 id="what-is-it">What is it?</h3>
<p>It's the bad practice of writing the same thing (or something very similar) more than once. Plain and simple.</p>
<h3 id="why-is-it-bad">Why is it bad?</h3>
<p>Let's say that you write a simple function used only in one part of the code, maybe even as a private method of a class, now days go by and you (or, worse, someone else) need to do the same thing you did, should he re-write it? Of course not, but you left no other choice.</p>
<p>This leads to bloated code and makes it harder to fix any bug that your function may have, since it now needs to be solved more than one time for every copy of your function.</p>
<h3 id="the-solution">The solution</h3>
<p>Instead of writing code for very specific situations try to write it as if it were to be included in a library, in that scenario it should work for a wide range of use cases by users you'll never meet. Using this mindset allows you to write more adaptable code, reducing repetition across your codebase.</p>
<p><em>However</em>... there is a fine line between <strong>generic </strong> and <strong><em>too</em> generic</strong>. Let's see why!</p>
<h2 id="single-point-of-failure-too-much-responsibility">Single point of failure / Too much responsibility</h2>
<p>Yes, I'm contradicting myself... well, kind of.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1625054305015/F-JVHZuxa.jpeg" alt="Single Point of Failure" /></p>
<h3 id="what-is-it">What is it?</h3>
<p>While having a class, component or service that does a lot of things can seem practical it can lead to some unexpected results.</p>
<h3 id="why-is-it-bad">Why is it bad?</h3>
<p>If a lot of your codebase is dependent on a single piece (or only a few pieces) of code then, in the case of a failure, the majority of your application (if not the whole thing) will be brought to a screeching halt.</p>
<p>It's the same thing with servers: </p>
<blockquote>
<p>You wouldn't want ALL of your company's services running on the same machine.
I hope not!</p>
</blockquote>
<h3 id="the-solution">The solution</h3>
<p>Every component of your application needs to have <strong>one job and one job only</strong>. It's better to use a lot of smaller components than one big, heavy and beefy one. <em><a target="_blank" href="https://andrewlundy.hashnode.dev/dependency-injection-what-is-it-and-how-to-use-it">Dependency Injection</a></em> and microservices help a lot with this.</p>
<h1 id="conclusion">Conclusion</h1>
<p>If you find some of these common errors in your codebase then a good ol' <strong>refactoring</strong> is in order! Learn how to effectively re-structure your code with this in-depth article by <a class="user-mention" href="https://hashnode.com/@tigerabrodi">Tiger Abrodi</a> entitled "<a target="_blank" href="https://tigerabrodi.hashnode.dev/lessons-and-takeaways-on-refactoring">The importance of refactoring</a>".</p>
<p><a target="_blank" href="https://en.wikipedia.org/wiki/Anti-pattern">Here</a>  you can also find <strong><em>The big list of the most common anti-patterns</em></strong>. Enjoy!</p>
<p>Thanks for your attention, have a nice rest of your day!</p>
]]></content:encoded></item><item><title><![CDATA[What a good framework SHOULD do]]></title><description><![CDATA[I'm sure that many of us developers, to make our work easier, had to use - or in some cases build - a variety of frameworks that aim to simplify our workflow.
A framework, by definition, is a bit of support logic that helps the developer; following t...]]></description><link>https://blog.snisni.it/what-a-good-framework-should-do</link><guid isPermaLink="true">https://blog.snisni.it/what-a-good-framework-should-do</guid><category><![CDATA[programming]]></category><category><![CDATA[framework]]></category><category><![CDATA[frameworks]]></category><category><![CDATA[Open Source]]></category><dc:creator><![CDATA[Mattia Sinisi]]></dc:creator><pubDate>Mon, 05 Oct 2020 19:49:31 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1615910694511/X1PnVmMmJ.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I'm sure that many of us developers, to make our work easier, had to use - or in some cases build - a variety of frameworks that aim to simplify our workflow.</p>
<p>A framework, by definition, is a bit of support logic that helps the developer; following this interpretation one could assume that it is <strong>a tool to organize your code</strong>, however, as <em>Rich Harris</em> (the creator of  <a target="_blank" href="https://svelte.dev">Svelte</a> ) puts it:</p>
<blockquote>
<p>A framework is a tool to organize your mind.</p>
</blockquote>
<p>Following this concept, developing using such a tool should let us focus more on the concepts unique to our app, rather than everything that comes between a blank project and a working demo (i.e. configuration, helpers, and base logic).</p>
<p>So, why did I use the word "should"? Simple, it's because not every framework does that. Which brings me to this article, here I'd like to list what, in my opinion, a good framework should let me do in order to build the app I wanted.</p>
<h1 id="remove-repetitive-actions">Remove repetitive actions</h1>
<p>Whatever your project is, whatever language you use, there are some things that you ALWAYS have to do in order to get it up and running, even as a crude prototype. If these actions are always the same, why then must I repeat them every time?</p>
<p>As an example, let's say that you have an application that needs to retrieve pieces of information from a database. The connection and subsequent disconnection shouldn't be something that I have to worry about every time, so how about a framework that lets me do this?</p>
<pre><code><span class="hljs-keyword">Database</span>.<span class="hljs-keyword">from</span>(<span class="hljs-string">'posts'</span>).<span class="hljs-keyword">get</span>([<span class="hljs-string">'title'</span>, <span class="hljs-string">'content'</span>, <span class="hljs-string">'author'</span>]);
</code></pre><h1 id="be-customizable-not-get-in-the-way">Be customizable / Not get in the way</h1>
<p>Simplicity is all fine and dandy, but what happens when a developer needs to perform an action that the developer of the framework didn't consider?</p>
<p>Especially with open-source tools, I should be able to access the framework's API at a lower level of abstraction in order to carry out my task.</p>
<p>Better yet, I should be able to declare new features specific to my application and append them to whatever the framework is already exposing.</p>
<p>Let's get back to my example, imagine if after the information is retrieved the developer still wants the connection to be open, but our make-believe framework does not have such an option, how can we work around the problem?</p>
<p>We could try to modify our helper, effectively messing with the original code, or the framework could expose something to let us customize the behavior. Let's see what that could look like:</p>
<pre><code><span class="hljs-keyword">Database</span>.<span class="hljs-keyword">from</span>(<span class="hljs-string">'posts'</span>).<span class="hljs-keyword">get</span>([<span class="hljs-string">'title'</span>, <span class="hljs-string">'content'</span>, <span class="hljs-string">'author'</span>]).<span class="hljs-keyword">after</span>(<span class="hljs-keyword">function</span>(<span class="hljs-keyword">connection</span>) {
    <span class="hljs-keyword">connection</span>.keepOpen();
});
</code></pre><p>Using a framework should give you an advantage, not slow you down or make some actions impossible.</p>
<h1 id="be-understandable">Be understandable</h1>
<p>As a framework becomes more and more advanced it will expose more and more methods and parts of its API, this often translates into unending piles of function names and configuration parameters.</p>
<p>At this point, more than ever, the developer could begin to feel overwhelmed by all this functionality if it's not <a target="_blank" href="https://blog.snisni.it/writing-code-for-others">presented in the right way</a>.</p>
<p>At this point, the way you write in and of itself must be clear, self-documenting even! Let me share with you a perfect example of this from the beautifully cohesive <a target="_blank" href="https://laravel.com">Laravel</a>:</p>
<pre><code><span class="hljs-comment">// Here we are getting all the users living in Italy</span>
<span class="hljs-comment">// and returning them alongside their siblings</span>
User::<span class="hljs-keyword">where</span>(<span class="hljs-string">"location"</span>, <span class="hljs-string">"Italy"</span>)-&gt;with(<span class="hljs-string">"siblings"</span>);
</code></pre><p>This could work for something as simple as this following example taken from a random unit test written with the help of <a target="_blank" href="https://jestjs.io">Jest</a>:</p>
<pre><code><span class="hljs-comment">// Here we are... well, you can guess it</span>
<span class="hljs-selector-tag">expect</span>(<span class="hljs-number">2</span> + <span class="hljs-number">2</span>)<span class="hljs-selector-class">.toBe</span>(<span class="hljs-number">4</span>);
<span class="hljs-selector-tag">expect</span>(<span class="hljs-number">1</span> + <span class="hljs-number">1</span>)<span class="hljs-selector-class">.not</span><span class="hljs-selector-class">.toBe</span>(<span class="hljs-number">10</span>);
</code></pre><hr />
<p>To conclude this article I'd like to once again thank each and every one of the members of this community for responding so positively and critically to my previous 2 articles, it really helped me a lot with my writings.</p>
<p>Let me know what you think on this subject!</p>
]]></content:encoded></item><item><title><![CDATA[Writing code for others]]></title><description><![CDATA[Today I'd like to talk about collaboration in developer teams of all sizes.
Introduction
When everyone begins coding it's most likely that they'll learn and experiment all by themselves, that's perfectly fine, It's how I and almost anyone I know firs...]]></description><link>https://blog.snisni.it/writing-code-for-others</link><guid isPermaLink="true">https://blog.snisni.it/writing-code-for-others</guid><category><![CDATA[programming ]]></category><category><![CDATA[coding]]></category><category><![CDATA[Collaboration]]></category><dc:creator><![CDATA[Mattia Sinisi]]></dc:creator><pubDate>Wed, 23 Sep 2020 13:51:33 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1600872384129/jvGNhnjKi.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Today I'd like to talk about collaboration in developer teams of all sizes.</p>
<h1 id="introduction">Introduction</h1>
<p>When everyone begins coding it's most likely that they'll learn and experiment all by themselves, that's perfectly fine, It's how I and almost anyone I know first began. As you begin writing (by yourself) any sort of application your top priority is to make it work, which means having your codebase organized in such a way that makes sense to you.</p>
<p>It's really easy to <em>follow the flow</em> and write for long periods of time without anything stopping you, and that way you'll have your application up and running in no-time.</p>
<p>Knowing that I'd like to ask you this: <strong>have you ever revisited an old project of yours?</strong></p>
<p>If so your first reaction would be something along the lines of: "<em>Wait, did I write that?</em>"</p>
<p>That's completely normal, when you're the only person who's going to see that code it makes perfect sense not to worry about legibility or even having a loose structure - often called <em>design pattern</em> - to follow.</p>
<p>It's only when you add other people to your team that you begin to discover that a lot of what you've written is almost incomprehensible for someone new to your project.</p>
<h1 id="improving-your-code-facilitates-collaboration">Improving your code facilitates collaboration</h1>
<h3 id="0-define-a-design-patternhttpscodetutspluscomarticlesa-beginners-guide-to-design-patterns-net-12752">0. Define a <a target="_blank" href="https://code.tutsplus.com/articles/a-beginners-guide-to-design-patterns--net-12752">design pattern</a></h3>
<p>A good way to start a project, especially an open-source one, is to clearly define the rules of your codebase: <strong>where everything goes and how the jobs are distributed</strong>.</p>
<p>To do this I've compiled some useful techniques that will greatly improve productivity and legibility.</p>
<h3 id="1-separate-logic">1. Separate logic</h3>
<p>Everything in your app should have a specific job that it does well, all other components should treat those containers of logic as a <strong>black box</strong>, only accessible through functions / methods that you've defined.</p>
<p>You should be able to modify (or even change a component) without touching the rest of your application. A good way of doing this (if your environment supports it) is via <a target="_blank" href="https://www.edureka.co/blog/what-is-dependency-injection/">dependency injection</a>.</p>
<p>If you're not comfortable with it then you should divide everything into sections, or better yet, create small libraries to handle that type of job.</p>
<blockquote>
<p>Nothing should EVER be written twice.</p>
</blockquote>
<h3 id="2-naming-conventions">2. Naming conventions</h3>
<blockquote>
<p>Naming things is one of the <a target="_blank" href="https://www.slideshare.net/pirhilton/how-to-name-things-the-hardest-problem-in-programming">hardest things in programming</a>.</p>
</blockquote>
<p>Let's imagine that you've successfully followed the first section and now your code is organized into different sections, now let's imagine that your team does not have access to them but can only use your functions / classes / helpers by calling them, at that point they should know what everything does just by looking at what's available to them: <strong>the name</strong>.</p>
<p>This subject is nothing new, even <a target="_blank" href="https://medium.com/swlh/george-orwells-6-rules-for-good-writing-are-6-rules-for-a-good-life-c65cfbc7527">George Orwell</a> has written about good writing and naming rules, but a good rule of thumb is to <strong>avoid looking at your code for about a week</strong> and then trying to <strong>understand what everything does just by the name</strong>.</p>
<p>A good way of keeping names consistent is by defining naming rules early on. As an example, can you guess what this line of code does?</p>
<pre><code><span class="hljs-attribute">ItemManager</span>::orderByName()
</code></pre><h3 id="3-take-some-time-to-write-documentation">3. Take some time to write documentation</h3>
<p>Naming conventions have their limits, you should avoid writing super long names; so, to help your team you should take some time at the end of your project to write a small documentation or wiki.</p>
<p>Better yet, if you're lazy like me, you should comment every usable thing in your codebase and then use <a target="_blank" href="https://tallyfy.com/software-documentation-tools/#:~:text=%20Automatic%20generation%20software%20documentation%20tools%20%201,Studio%20extension%20that%20automatically%20generates%20XML...%20More%20">auto-documenting tools</a> to convert them to a small wiki.</p>
<h1 id="conclusion">Conclusion</h1>
<p>I hope that this article was helpful to you or to your team, having a clear codebase is something that makes or breaks your organization. You shouldn't waste more time <em>finding the issue</em> than <em>resolving it</em>.</p>
<p>Thank you for reading!</p>
]]></content:encoded></item><item><title><![CDATA[How open source saved our business]]></title><description><![CDATA[Introduction
I'd like to start by giving a little background information about my work experience. Like many developers trying to make a name for themselves, I too started as a freelancer; my work consisted of simple client applications or RESTful AP...]]></description><link>https://blog.snisni.it/how-open-source-saved-our-business</link><guid isPermaLink="true">https://blog.snisni.it/how-open-source-saved-our-business</guid><dc:creator><![CDATA[Mattia Sinisi]]></dc:creator><pubDate>Mon, 21 Sep 2020 13:58:07 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1600696864089/LojFFo33i.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="introduction">Introduction</h2>
<p>I'd like to start by giving a little background information about my work experience. Like many developers trying to make a name for themselves, I too started as a freelancer; my work consisted of simple client applications or RESTful APIs.</p>
<p>While working on all sorts of projects the CEO of a tiny startup called me and asked if I was interested in working long-term with them: this was like a dream come true.</p>
<p>You see, the atmosphere in a startup is very different from that of a traditional company, there's a lot more experiments with new technologies, much more freedom to try new things.</p>
<p>There's also another aspect that defines a startup, one that is largely ignored while discussing  them: the shortage of money.</p>
<h2 id="initial-struggles-and-our-breakthrough">Initial struggles and our breakthrough</h2>
<p>Building a large-scale application without funding can be difficult - schedules need to be respected and tons of hours are spent working on a project without the certainty of it ever being finished or used - and to optimize work as much as possible we heavily relied on open source frameworks and libraries.</p>
<p>This is not what saved our business though, using it just meant that we worked less on problems that had already been solved. The major breakthrough was publishing some of our work as libraries. Our thought process was this: "If this app fails then we'll have wasted our work, so let's publish it and hope that someone else would find it useful".</p>
<blockquote>
<p>That was the best decision we had ever made.</p>
</blockquote>
<p>Our libraries were quickly noticed by other fellow developers and word got out about who we were and what we stood for. Working for free and giving to the public were major selling points for us.</p>
<p>Eventually our name reached some investors who saw our projects and began giving funding, a new startup had solidified. After months of uncertainty, standing on stable ground was a great sensation, we did it without marketing, without sponsors, we succeeded just because we had created something useful.</p>
<h2 id="takeaways">Takeaways</h2>
<p>Ever since I've witnessed the power of a good open source project, and the effect it could have on a company I vowed to always distributes my most frequent work as packages or libraries.</p>
<p>Even when working with bigger companies I always suggest publishing libraries to get our name across, build an image of developer-friendliness that can boost our brand and - most importantly - have a bigger audience to test parts of our code as independent and useful products.</p>
<p>I hope you join me as well. Thank you for reading.</p>
]]></content:encoded></item></channel></rss>