<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Eran Stiller</title>
	<atom:link href="https://eranstiller.com/feed" rel="self" type="application/rss+xml" />
	<link>https://eranstiller.com</link>
	<description>Architect. Build. Repeat.</description>
	<lastBuildDate>Wed, 17 Dec 2025 10:58:35 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://eranstiller.com/wp-content/uploads/2023/03/cropped-Color-logo-initials-with-background-32x32.png</url>
	<title>Eran Stiller</title>
	<link>https://eranstiller.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Architecture Through Different Lenses 2025</title>
		<link>https://eranstiller.com/architecture-through-different-lenses-2025</link>
					<comments>https://eranstiller.com/architecture-through-different-lenses-2025#respond</comments>
		
		<dc:creator><![CDATA[Eran Stiller]]></dc:creator>
		<pubDate>Wed, 17 Dec 2025 10:55:35 +0000</pubDate>
				<category><![CDATA[Software Architecture]]></category>
		<guid isPermaLink="false">https://eranstiller.com/?p=3879</guid>

					<description><![CDATA[<p>Why does your code look the way it does? What forces shaped that general utilities library everyone contributes to? How can platforms succeed by being invisible? When should teams make their own architectural decisions rather than wait for approval? And as multi-cloud becomes inevitable, how do we build systems that actually thrive across provider boundaries?...</p>
<p>The post <a rel="nofollow" href="https://eranstiller.com/architecture-through-different-lenses-2025">Architecture Through Different Lenses 2025</a> appeared first on <a rel="nofollow" href="https://eranstiller.com">Eran Stiller</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Why does your code look the way it does? What forces shaped that general utilities library everyone contributes to? How can platforms succeed by being invisible? When should teams make their own architectural decisions rather than wait for approval? And as multi-cloud becomes inevitable, how do we build systems that actually thrive across provider boundaries?</p>



<p>I&#8217;m excited to share that InfoQ&#8217;s latest eMag, &#8220;Architecture through Different Lenses&#8221;, is now live! This is the first eMag I served as the managing editor for, and I couldn&#8217;t be happier with the result!</p>



<p>Software architecture in 2025 extends far beyond technical diagrams and design patterns. Accordingly, this eMag explores architecture through five distinct lenses: the socio-technical forces that invisibly shape our code, the paradox of infrastructure that succeeds by disappearing, the power of distributed intelligence over centralized control, the evolutionary advantage of iteration over revolution, and the pragmatic reality of designing for inevitable complexity.</p>



<p>As architects, we constantly navigate tensions between ideal and pragmatic, innovation and stability, speed and safety. These articles won’t give you a single answer, because there isn’t any. Instead, they offer perspectives that help you see your own challenges more clearly and provide patterns others have used successfully. Most importantly, they remind you that the best architectures emerge when we stop pretending technology exists separately from the humans who build and use it.</p>



<p><a href="https://www.infoq.com/minibooks/architecture-lenses-2025/" target="_blank" rel="noopener">Download your copy of the eMag now</a>. Enjoy!</p>



<p></p>
<p>The post <a rel="nofollow" href="https://eranstiller.com/architecture-through-different-lenses-2025">Architecture Through Different Lenses 2025</a> appeared first on <a rel="nofollow" href="https://eranstiller.com">Eran Stiller</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://eranstiller.com/architecture-through-different-lenses-2025/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>RabbitMQ vs Kafka: Which Platform to Choose in 2023?</title>
		<link>https://eranstiller.com/rabbitmq-vs-kafka</link>
					<comments>https://eranstiller.com/rabbitmq-vs-kafka#respond</comments>
		
		<dc:creator><![CDATA[Eran Stiller]]></dc:creator>
		<pubDate>Sun, 15 Oct 2023 06:39:36 +0000</pubDate>
				<category><![CDATA[Software Architecture]]></category>
		<guid isPermaLink="false">https://eranstiller.com/?p=3749</guid>

					<description><![CDATA[<p>Have you ever found yourself standing at a crossroads, trying to decide between RabbitMQ vs Kafka for your Microservices-based system? Have you ever wondered which of these messaging platforms is most suitable for your use case? RabbitMQ and Apache Kafka are well-known solutions in the asynchronous messaging domain, but despite popular belief, they aren&#8217;t one-size-fits-all...</p>
<p>The post <a rel="nofollow" href="https://eranstiller.com/rabbitmq-vs-kafka">RabbitMQ vs Kafka: Which Platform to Choose in 2023?</a> appeared first on <a rel="nofollow" href="https://eranstiller.com">Eran Stiller</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Have you ever found yourself standing at a crossroads, trying to decide between RabbitMQ vs Kafka for your Microservices-based system? Have you ever wondered which of these messaging platforms is most suitable for your use case?</p>



<p>RabbitMQ and Apache Kafka are well-known solutions in the asynchronous messaging domain, but despite popular belief, they aren&#8217;t one-size-fits-all solutions. As a software architect, I have seen firsthand how the wrong decision can break what would otherwise be a solid software architecture.</p>



<p>Dive deeper with me as I demystify the basic patterns of asynchronous messaging. I&#8217;ll unveil the unique structures of Apache Kafka and RabbitMQ, guiding you through their intricate designs and mechanisms.</p>



<p>Keep reading to discover the key differences, the pros and cons, and get expert advice on how to make the right choice for your unique scenario. Your perfect match might be just a few paragraphs away!</p>


<div class="kb-row-layout-wrap kb-row-layout-id3749_5c1b19-b7 alignnone wp-block-kadence-rowlayout"><div class="kt-row-column-wrap kt-has-1-columns kt-row-layout-equal kt-tab-layout-inherit kt-mobile-layout-row kt-row-valign-top">

<div class="wp-block-kadence-column kadence-column3749_4917ea-8e inner-column-1"><div class="kt-inside-inner-col">
<h2 class="wp-block-heading">Key Takeaways</h2>



<ul class="wp-block-list">
<li>RabbitMQ is a message broker, while Kafka is a distributed streaming platform.</li>



<li>Kafka excels in real-time data streaming and guarantees in-order message processing within topic partitions.</li>



<li>RabbitMQ provides advanced message routing based on subscriber rules and supports features like Message TTL.</li>



<li>Kafka lacks built-in filtering capabilities and TTL mechanisms but scales well through partitioning.</li>



<li>The choice between RabbitMQ and Kafka depends on specific requirements and the desired use case.</li>
</ul>
</div></div>

</div></div>




<h2 class="wp-block-heading">What Are Asynchronous Messaging Patterns?</h2>



<p>Asynchronous messaging is a messaging scheme where message production by a producer is decoupled from its processing by a consumer. When dealing with messaging systems, we typically identify two main messaging patterns &#8211; Message Queuing and Publish/Subscribe.</p>



<h3 class="wp-block-heading">Message Queueing</h3>



<p>In the Message Queuing communication pattern, queues temporally decouple producers from consumers. Queues also allow us to scale producers and consumers independently and provide a degree of fault tolerance against processing errors.</p>



<p>Multiple producers can send messages to the same queue; however, when a consumer processes a message, it is locked or removed from the queue and is no longer available. Only a single consumer consumes a specific message.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img fetchpriority="high" decoding="async" width="642" height="241" src="https://eranstiller.com/wp-content/uploads/2020/02/RabbitMQ-vs-Kafka-Message-Queuing.svg" alt="An illustration of message queue as a transport between producers and consumers" class="wp-image-2478"/><figcaption class="wp-element-caption">Message Queuing</figcaption></figure>
</div>


<p>If the consumer fails to process a specific message, the messaging platform typically returns the message to the queue, making it available to other consumers.</p>



<h3 class="wp-block-heading">Publish/Subscribe</h3>



<p>In the Publish/Subscribe (or Pub/Sub) communication pattern, multiple subscribers can receive and process a single message concurrently.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img decoding="async" width="675" height="369" src="https://eranstiller.com/wp-content/uploads/2020/02/RabbitMQ-vs-Kafka-PubSub.svg" alt="An illustration of a pub/sub message exchange" class="wp-image-2479"/><figcaption class="wp-element-caption">Publish/Subscribe</figcaption></figure>
</div>


<p>For example, this pattern allows a publisher to notify all subscribers that something has happened in the system.</p>



<p>Many queueing platforms often associate pub/sub with the term&nbsp;<strong>topics</strong>. In RabbitMQ, topics are a specific type of pub/sub implementation (a type of exchange, to be exact), but during this post, I refer to topics as a representation of pub/sub as a whole.</p>



<p>Generically speaking, there are two types of subscriptions:</p>



<ol class="wp-block-list">
<li><strong>An ephemeral subscription</strong>, where the subscription is only active as long the consumer is up and running. Once the consumer shuts down, its subscription and yet-to-be-processed messages are lost.</li>



<li><strong>A durable subscription</strong>, where the subscription is maintained as long as it is not explicitly deleted. When the consumer shuts down, the messaging platform maintains the subscription, and message processing can be resumed later.</li>
</ol>



<h2 class="wp-block-heading">What is RabbitMQ?</h2>



<p><a href="https://www.rabbitmq.com/" target="_blank" rel="noreferrer noopener">RabbitMQ</a>&nbsp;is an open-source&nbsp;<a href="https://en.wikipedia.org/wiki/Message_broker" data-type="link" data-id="https://en.wikipedia.org/wiki/Message_broker" target="_blank" rel="noopener">Message Broker</a> and is also often referred to as a&nbsp;<a href="https://en.wikipedia.org/wiki/Enterprise_service_bus" data-type="link" data-id="https://en.wikipedia.org/wiki/Enterprise_service_bus" target="_blank" rel="noopener">Service Bus</a>. It natively supports both messaging patterns described above.</p>



<p>Other popular implementations of message brokers include&nbsp;<a href="https://activemq.apache.org/" target="_blank" rel="noreferrer noopener">ActiveMQ</a>,&nbsp;<a href="https://zeromq.org/" target="_blank" rel="noreferrer noopener">ZeroMQ</a>,&nbsp;<a href="https://azure.microsoft.com/en-us/services/service-bus/" target="_blank" rel="noreferrer noopener">Azure Service Bus</a>, and&nbsp;<a href="https://aws.amazon.com/sqs/" target="_blank" rel="noreferrer noopener">Amazon Simple Queue Service (SQS)</a>. These implementations have a lot in common; many concepts described in this post apply to most of them.</p>



<h3 class="wp-block-heading">Queues</h3>



<p>RabbitMQ supports classic Message Queuing out of the box. A developer defines named queues, and then publishers can send messages to that named queue. Consumers, in turn, use the same queue to retrieve messages to process them.</p>


<div class="kb-row-layout-wrap kb-row-layout-id3749_095d2d-4f alignnone wp-block-kadence-rowlayout"><div class="kt-row-column-wrap kt-has-1-columns kt-row-layout-equal kt-tab-layout-inherit kt-mobile-layout-row kt-row-valign-top">

<div class="wp-block-kadence-column kadence-column3749_73d079-bf inner-column-1"><div class="kt-inside-inner-col">
<p>It&#8217;s worth mentioning that under the hood, this simple setup is emulated by creating a &#8220;Direct Exchange,&#8221; which filters queue delivery based on a simple routing rule. You can read more on Message Exchanges in the following section.</p>
</div></div>

</div></div>


<h3 class="wp-block-heading">Message Exchanges</h3>



<p>RabbitMQ implements Pub/Sub via the use of message exchanges. A publisher publishes its messages to a message exchange without knowing who are the subscribers of these messages.</p>



<p>Each consumer wishing to subscribe to an exchange creates its queue; the message exchange then queues produced messages for consumers to consume. It can also filter messages for some subscribers based on various routing rules.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img decoding="async" width="675" height="369" src="https://eranstiller.com/wp-content/uploads/2020/02/RabbitMQ-vs-Kafka-RabbitMQ-Message-Exchange.svg" alt="An illustration of a RabbitMQ Message Exchange" class="wp-image-2480"/><figcaption class="wp-element-caption">RabbitMQ Message Exchange</figcaption></figure>
</div>


<p>It is important to note that RabbitMQ supports both ephemeral and durable subscriptions. A consumer can decide the type of subscription they&#8217;d like to employ via RabbitMQ&#8217;s API.</p>



<p>Due to RabbitMQ&#8217;s architecture, we can also create a hybrid approach where some subscribers form&nbsp;<strong>consumer groups</strong>&nbsp;who work together processing messages in the form of competing consumers over a specific queue. In this manner, we implement the pub/sub pattern while allowing some subscribers to scale up to handle received messages.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="679" height="369" src="https://eranstiller.com/wp-content/uploads/2020/02/RabbitMQ-vs-Kafka-RabbitMQ-Consumer-Groups.svg" alt="An illustration of RabbitMQ fanout topology with routing and consumer groups" class="wp-image-2481"/><figcaption class="wp-element-caption">Pub/Sub &amp; Queuing Combined</figcaption></figure>
</div>


<h2 class="wp-block-heading">What is Apache Kafka?</h2>



<p><a href="https://kafka.apache.org/" target="_blank" rel="noreferrer noopener">Apache Kafka</a>&nbsp;is&nbsp;not&nbsp;an implementation of a message broker. Instead, it is an open-source&nbsp;distributed event streaming platform. Unlike RabbitMQ, which is based on queues and exchanges, Kafka&#8217;s storage layer uses a partitioned transaction log (read more below under <a href="#topics">Topics</a>).</p>



<p>Kafka also provides a Streams API to process streams in real time and a Connectors API for easy integration with various data sources. However, these are out of the scope of this post.&nbsp;</p>



<p>The Cloud Vendors provide alternative solutions for Kafka&#8217;s storage layer. These solutions include&nbsp;<a href="https://azure.microsoft.com/en-us/services/event-hubs/" target="_blank" rel="noreferrer noopener">Azure Event Hubs</a> and, to some extent,&nbsp;AWS Kinesis Data Streams. There are also cloud-specific and open-source alternatives to Kafka&#8217;s stream processing capabilities, but again, these are out of the scope of this post.</p>



<h3 class="wp-block-heading" id="topics">Topics</h3>



<p>Kafka does not implement the notion of a queue. Instead, Kafka stores collections of records in categories called topics.</p>



<p>For each topic, Kafka maintains a partitioned log of messages. Each partition is an ordered, immutable sequence of records where messages are continually appended. Kafka appends messages to these partitions as they arrive. By default, it uses a round-robin partitioner to spread messages uniformly across partitions.</p>



<p>Producers can modify this behavior to create logical streams of messages. For example, we might want to make logical message streams in a multitenant application according to every message&#8217;s tenant ID. In an IoT scenario, we might want to map each producer&#8217;s identity to a specific partition constantly.</p>



<p>Ensuring all messages from the same logical stream map to the same partition guarantees their in-order delivery to consumers.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="571" height="396" src="https://eranstiller.com/wp-content/uploads/2020/02/RabbitMQ-vs-Kafka-Kafka-Producers.svg" alt="An illustration of producers for a Kafka topic and its inner structure" class="wp-image-2482"/><figcaption class="wp-element-caption">Kafka Producers</figcaption></figure>
</div>


<p>Consumers consume messages by maintaining an offset (or index) to these partitions and reading them sequentially. A single consumer can consume multiple topics, and consumers can scale up to the number of partitions available. As a result, when creating a topic, one should carefully consider the expected throughput of messaging on that topic.</p>



<p>A group of consumers working together to consume a topic is called a&nbsp;<strong>consumer group</strong>. Kafka&#8217;s API typically handles the balancing of partition processing between consumers in a consumer group and storing consumers&#8217; current partition offsets.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="562" height="330" src="https://eranstiller.com/wp-content/uploads/2020/02/RabbitMQ-vs-Kafka-Kafka-Consumers.svg" alt="An illustration of consumer groups for a Kafka topic and its inner structure" class="wp-image-2483"/><figcaption class="wp-element-caption">Kafka Consumers</figcaption></figure>
</div>


<h3 class="wp-block-heading">Implementing Messaging Patterns with Kafka</h3>



<p>Kafka&#8217;s implementation maps quite well to the pub/sub pattern. A producer can send messages to a specific topic, and multiple consumer groups can consume the same message. Each consumer group can scale individually to handle the load (up to the number of available partitions).</p>



<p>Since consumers maintain their partition offset, they can choose to have a durable subscription that maintains its offset across restarts or an ephemeral subscription, which throws the offset away and restarts from the latest record in each partition every time it starts up. However, it is a less-than-perfect fit for the message queuing pattern.</p>



<p>Of course, we could have a topic with just a single consumer group to emulate classic Message Queuing. Nevertheless, this has multiple drawbacks that are discussed later in this post.</p>



<p>It is important to note that Kafka retains messages in partitions up to a preconfigured period, regardless of whether consumers consumed these messages. This retention means that consumers are free to reread past messages. Furthermore, developers can also use Kafka&#8217;s storage layer for implementing mechanisms such as Event Sourcing and Audit Logs.</p>



<h2 class="wp-block-heading">What Are the Differences between RabbitMQ and Apache Kafka?</h2>



<p>While RabbitMQ and Kafka are sometimes interchangeable, their implementations are very different. As a result, we cannot view them as members of the same category of tools; one is a message broker, and the other is a distributed event streaming platform. As solution architects, we should acknowledge these differences and actively consider which solutions we should use for a given scenario.</p>



<p>For example, Kafka is best used for processing data streams, while RabbitMQ has minimal guarantees regarding ordering messages within a stream. On the other hand, RabbitMQ has built-in support for retry logic and dead-letter exchanges, while Kafka leaves such implementations in the hands of its users.</p>



<p>This section highlights these and other notable differences between Apache Kafka vs RabbitMQ.</p>



<h3 class="wp-block-heading">Message Ordering</h3>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="686" src="https://eranstiller.com/wp-content/uploads/2020/02/arshad-pooloo-FK3s0hRpMNM-unsplash-1024x686.jpg" alt="" class="wp-image-2504" srcset="https://eranstiller.com/wp-content/uploads/2020/02/arshad-pooloo-FK3s0hRpMNM-unsplash-1024x686.jpg 1024w, https://eranstiller.com/wp-content/uploads/2020/02/arshad-pooloo-FK3s0hRpMNM-unsplash-300x201.jpg 300w, https://eranstiller.com/wp-content/uploads/2020/02/arshad-pooloo-FK3s0hRpMNM-unsplash-768x514.jpg 768w, https://eranstiller.com/wp-content/uploads/2020/02/arshad-pooloo-FK3s0hRpMNM-unsplash-1536x1028.jpg 1536w, https://eranstiller.com/wp-content/uploads/2020/02/arshad-pooloo-FK3s0hRpMNM-unsplash-2048x1371.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption"> Photo by&nbsp;<a href="https://unsplash.com/@ar_shad?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" target="_blank" rel="noopener">Arshad Pooloo</a>&nbsp;on&nbsp;<a href="https://unsplash.com/s/photos/series?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" target="_blank" rel="noopener">Unsplash</a> </figcaption></figure>
</div>


<p>RabbitMQ provides few guarantees regarding ordering messages sent to a queue or exchange. While it may seem evident that consumers process messages in the order producers send them, this is very misleading. The RabbitMQ documentation states the following regarding its ordering guarantees:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Messages published in one channel, passing through one exchange and one queue and one outgoing channel will be received in the same order that they were sent.</p>
<cite><a href="https://www.rabbitmq.com/semantics.html" target="_blank" rel="noreferrer noopener" aria-label="RabbitMQ Broker Semantics (opens in a new tab)">RabbitMQ Broker Semantics</a></cite></blockquote>



<p>Differently put, as long as we have a single message consumer, it receives messages in order. However, once multiple consumers read messages from the same queue, we have no guarantee regarding the processing order of messages.</p>



<p>This lack of ordering guarantee happens because consumers might return (or redeliver) messages to the queue after reading them (e.g., processing failure). Once a message is returned, another consumer can pick it up for processing even if it has already consumed a later message. Thus, the following diagram shows that consumer groups process messages out of order.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="732" height="878" src="https://eranstiller.com/wp-content/uploads/2020/02/RabbitMQ-vs-Kafka-Part-2-Message-Ordering-RabbitMQ.svg" alt="An example of lost message ordering when using RabbitMQ" class="wp-image-2497"/><figcaption class="wp-element-caption">An example of lost message ordering when using RabbitMQ</figcaption></figure>
</div>


<p>Of course, we could regain message ordering in RabbitMQ by limiting consumer concurrency to one. More precisely, the thread count within the single consumer should be limited to one since any parallel message processing can cause the same out-of-order issue. However, limiting ourselves to one single-threaded consumer severely impacts our ability to scale message processing as our system grows. As a result, we should not light-heartedly perform this tradeoff.</p>



<p>On the other hand, Kafka provides a reliable ordering guarantee for message processing. Kafka guarantees that all messages sent to the same topic partition are processed in order. By default, Kafka places messages in partitions with a round-robin partitioner.</p>



<p>However, a producer can set a partition key on each message to create logical data streams (such as messages from the same device or messages belonging to the same tenant). All messages from the same stream are then placed within the same partition, causing them to be processed in order by consumer groups.</p>



<p>We should note, however, that within a consumer group, each partition is processed by a single thread of a single consumer. As a result, we cannot scale the processing of a single partition. However, in Kafka, we can scale the number of partitions within a topic, causing each partition to receive fewer messages and adding additional consumers for the additional partitions.</p>



<p><strong><em>Winner&nbsp;</em></strong><em>&#8211; Kafka is the clear winner as it allows processing messages in order. RabbitMQ only has weak guarantees in this regard.</em></p>



<h3 class="wp-block-heading">Message Routing</h3>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="642" src="https://eranstiller.com/wp-content/uploads/2020/02/webaroo-tN344soypQM-unsplash-1024x642.jpg" alt="" class="wp-image-2511" srcset="https://eranstiller.com/wp-content/uploads/2020/02/webaroo-tN344soypQM-unsplash-1024x642.jpg 1024w, https://eranstiller.com/wp-content/uploads/2020/02/webaroo-tN344soypQM-unsplash-300x188.jpg 300w, https://eranstiller.com/wp-content/uploads/2020/02/webaroo-tN344soypQM-unsplash-768x482.jpg 768w, https://eranstiller.com/wp-content/uploads/2020/02/webaroo-tN344soypQM-unsplash-1536x963.jpg 1536w, https://eranstiller.com/wp-content/uploads/2020/02/webaroo-tN344soypQM-unsplash-2048x1284.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption"> Photo by&nbsp;<a href="https://unsplash.com/@webaroo?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" target="_blank" rel="noopener">Webaroo</a>&nbsp;on&nbsp;<a href="https://unsplash.com/s/photos/router?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" target="_blank" rel="noopener">Unsplash</a> </figcaption></figure>
</div>


<p>RabbitMQ can route messages to subscribers of a message exchange based on subscriber-defined routing rules. A&nbsp;<a href="https://www.rabbitmq.com/tutorials/amqp-concepts.html#exchange-topic" target="_blank" rel="noreferrer noopener">Topic Exchange</a>&nbsp;can route messages based on a dedicated header named&nbsp;<em>routing_key</em>. Alternatively, a&nbsp;<a href="https://www.rabbitmq.com/tutorials/amqp-concepts.html#exchange-headers" target="_blank" rel="noreferrer noopener">Headers Exchange</a>&nbsp;can route messages based on arbitrary message headers. Both exchanges effectively allow consumers to specify the type of messages they want to receive, thus providing solution architects with great flexibility.</p>



<p>On the other hand, Kafka does not allow consumers to filter messages on a topic before polling them. A subscribed consumer receives all messages in a partition without exception. As a developer, you could use a&nbsp;Kafka Stream Job, which reads messages from the topic, filters them, and pushes them to another topic to which a consumer can subscribe. Nonetheless, this requires more effort and maintenance and has more moving parts.</p>



<p><strong><em>Winner&nbsp;</em></strong><em>&#8211; RabbitMQ provides superior support for routing and filtering messages for consumers.</em></p>



<h3 class="wp-block-heading">Message Timing</h3>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="683" src="https://eranstiller.com/wp-content/uploads/2020/02/oliver-hale-AydJi_gx_3w-unsplash-1024x683.jpg" alt="" class="wp-image-2512" srcset="https://eranstiller.com/wp-content/uploads/2020/02/oliver-hale-AydJi_gx_3w-unsplash-1024x683.jpg 1024w, https://eranstiller.com/wp-content/uploads/2020/02/oliver-hale-AydJi_gx_3w-unsplash-300x200.jpg 300w, https://eranstiller.com/wp-content/uploads/2020/02/oliver-hale-AydJi_gx_3w-unsplash-768x512.jpg 768w, https://eranstiller.com/wp-content/uploads/2020/02/oliver-hale-AydJi_gx_3w-unsplash-1536x1024.jpg 1536w, https://eranstiller.com/wp-content/uploads/2020/02/oliver-hale-AydJi_gx_3w-unsplash-2048x1365.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption"> Photo by&nbsp;<a href="https://unsplash.com/@4themorningshoot?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" target="_blank" rel="noopener">Oliver Hale</a>&nbsp;on&nbsp;<a href="https://unsplash.com/s/photos/timing?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" target="_blank" rel="noopener">Unsplash</a> </figcaption></figure>
</div>


<p>RabbitMQ provides various capabilities in regards to timing a message sent to a queue:</p>



<ol class="wp-block-list">
<li><strong>Message Time-To-Live (TTL)</strong>&nbsp;&#8211; a&nbsp;<a href="https://www.rabbitmq.com/ttl.html" target="_blank" rel="noreferrer noopener">TTL</a>&nbsp;attribute can be associated with each message sent to RabbitMQ. Setting the TTL is done either directly by the publisher or as a policy on the queue itself. Specifying a TTL allows the system to limit the validity period of the message. If a consumer does not process it in due time, it is automatically removed from the queue (and transferred to a dead-letter exchange; read more on that later). TTL is beneficial for time-sensitive commands that become irrelevant after some time has passed without processing.</li>



<li><strong>Delayed/Scheduled Messages</strong>&nbsp;&#8211; RabbitMQ supports delayed/scheduled messages via a&nbsp;<a href="https://github.com/rabbitmq/rabbitmq-delayed-message-exchange" target="_blank" rel="noreferrer noopener">plugin</a>. When this plugin is enabled on a message exchange, a producer can send a message to RabbitMQ, and the producer can delay the time RabbitMQ routes this message to a consumer&#8217;s queue. This feature allows a developer to schedule future commands that are not meant to be handled before. For example, when a producer hits a throttling rule, we might want to delay the execution of specific commands later.</li>
</ol>



<p>Kafka provides no support for such features. It writes messages to partitions as they arrive, where they are immediately available for consumers to consume. Also, Kafka provides no TTL mechanism for messages, although we could implement one at the application level. We must also remember that a Kafka partition is an append-only transaction log. As a result, it cannot manipulate the message time (or location within the partition).</p>



<p><strong><em>Winner&nbsp;</em></strong><em>&#8211; RabbitMQ wins this hands-down, as the nature of its implementation limits Kafka.</em></p>



<h3 class="wp-block-heading">Message Retention</h3>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="684" src="https://eranstiller.com/wp-content/uploads/2020/02/chuttersnap-fyaTq-fIlro-unsplash-1024x684.jpg" alt="" class="wp-image-2514" srcset="https://eranstiller.com/wp-content/uploads/2020/02/chuttersnap-fyaTq-fIlro-unsplash-1024x684.jpg 1024w, https://eranstiller.com/wp-content/uploads/2020/02/chuttersnap-fyaTq-fIlro-unsplash-300x200.jpg 300w, https://eranstiller.com/wp-content/uploads/2020/02/chuttersnap-fyaTq-fIlro-unsplash-768x513.jpg 768w, https://eranstiller.com/wp-content/uploads/2020/02/chuttersnap-fyaTq-fIlro-unsplash-1536x1025.jpg 1536w, https://eranstiller.com/wp-content/uploads/2020/02/chuttersnap-fyaTq-fIlro-unsplash-2048x1367.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption"> Photo by&nbsp;<a href="https://unsplash.com/@chuttersnap?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" target="_blank" rel="noopener">chuttersnap</a>&nbsp;on&nbsp;<a href="https://unsplash.com/s/photos/storage?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" target="_blank" rel="noopener">Unsplash</a> </figcaption></figure>
</div>


<p>RabbitMQ evicts messages from storage as soon as consumers successfully consume them. This behavior cannot be modified. It is part of almost all message brokers&#8217; designs.</p>



<p>In contrast, Kafka persists all messages by design up to a configured timeout per topic. Regarding message retention, Kafka does not care about the consumption status of its consumers as it acts as a message log. Consumers can consume every message as much as they want and travel back and forth &#8220;in time&#8221; by manipulating their partition offset. Periodically, Kafka reviews the age of messages in topics and evicts those old enough messages.</p>



<p>Kafka&#8217;s performance is not dependent on storage size. So, in theory, one can store messages almost indefinitely without impacting performance (as long as your nodes are large enough to hold these partitions).</p>



<p><strong><em>Winner&nbsp;</em></strong><em>&#8211; Kafka is designed to retain messages, while RabbitMQ is not. There is no competition here, and Kafka is declared the winner.</em></p>



<h3 class="wp-block-heading">Fault Handling</h3>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="683" src="https://eranstiller.com/wp-content/uploads/2020/02/sarah-kilian-52jRtc2S_VE-unsplash-1024x683.jpg" alt="" class="wp-image-2515" srcset="https://eranstiller.com/wp-content/uploads/2020/02/sarah-kilian-52jRtc2S_VE-unsplash-1024x683.jpg 1024w, https://eranstiller.com/wp-content/uploads/2020/02/sarah-kilian-52jRtc2S_VE-unsplash-300x200.jpg 300w, https://eranstiller.com/wp-content/uploads/2020/02/sarah-kilian-52jRtc2S_VE-unsplash-768x512.jpg 768w, https://eranstiller.com/wp-content/uploads/2020/02/sarah-kilian-52jRtc2S_VE-unsplash-1536x1024.jpg 1536w, https://eranstiller.com/wp-content/uploads/2020/02/sarah-kilian-52jRtc2S_VE-unsplash-2048x1365.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption"> Photo by&nbsp;<a href="https://unsplash.com/@rojekilian?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" target="_blank" rel="noopener">Sarah Kilian</a>&nbsp;on&nbsp;<a href="https://unsplash.com/s/photos/error?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" target="_blank" rel="noopener">Unsplash</a> </figcaption></figure>
</div>


<p>When dealing with messages, queues, and events, developers are often under the impression that message processing always succeeds. After all, since producers place each message in a queue or topic, even if a consumer fails to process a message, it can simply retry until it succeeds.</p>



<p>While this is true, we should put additional thought into this process. We should acknowledge that message processing can fail in some scenarios. We should gracefully handle these situations, even if the solution is partly composed of human intervention.</p>



<p>There are two types of possible errors when processing messages:</p>



<ol class="wp-block-list">
<li><strong>Transient failures</strong>&nbsp;&#8211; failures that occur due to a temporary issue such as network connectivity, CPU load, and a service crash. We can usually mitigate this kind of failure by retrying over and over again.</li>



<li><strong>Persistent failures</strong>&nbsp;&#8211; failures that occur due to a permanent issue that cannot be resolved via additional retries. Common causes of these failures are software bugs or an invalid message schema (i.e., a poison message).</li>
</ol>



<p>As architects and developers, we should ask ourselves: How often do we retry upon a message processing failure? How long should we wait between retries? How do we distinguish between transient and persistent failures? And most importantly &#8211; what do we do when all retries fail or we encounter a persistent failure? While the answers to these questions are domain-specific, messaging platforms typically provide us with the tools to implement our solution.</p>



<p>RabbitMQ provides tools such as delivery retries and dead-letter exchanges (DLX) to handle message processing failures. The main idea of a DLX is that RabbitMQ can automatically route failed messages to a DLX based on an appropriate configuration and apply further processing rules on the message at this exchange, including delayed retries, retry counts, and delivery to a &#8220;human intervention&#8221; queue. <a href="https://engineering.nanit.com/rabbitmq-retries-the-full-story-ca4cc6c5b493" target="_blank" rel="noreferrer noopener">This article</a>&nbsp;provides additional insights on possible patterns for handling retries in RabbitMQ. </p>



<p>The most important thing to remember here is that in RabbitMQ when a consumer is busy processing and retrying a specific message (even before returning it to the queue), other consumers can concurrently process the messages that follow it. Message processing is not stuck while a specific consumer retries a particular message. As a result, a message consumer can synchronously retry a message for as much as it wants without affecting the entire system.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="470" height="298" src="https://eranstiller.com/wp-content/uploads/2020/02/RabbitMQ-vs-Kafka-Part-2-Fault-Handling-RabbitMQ.svg" alt="An example of fault handling 0- a consumer can continue retries on a message, while other consumers continue processing messages" class="wp-image-2498"/><figcaption class="wp-element-caption">Consumer 1 can continue retries on message 1 while other consumers continue processing messages.</figcaption></figure>
</div>


<p>Contrary to RabbitMQ, Kafka does not provide any such mechanisms out of the box. With Kafka, we must provide and implement message retry mechanisms at the application level. Also, we should note that when a consumer is busy synchronously retrying a specific message, other messages from the same partition cannot be processed.</p>



<p>We cannot reject and retry a specific message and commit a message that came after it since the consumer cannot change the message order. As you remember, the partition is merely an append-only log.</p>



<p>An application-level solution can commit failed messages to a &#8220;retry topic&#8221; and handle retries from there; however, we lose message ordering in this solution. An example of such an implementation by Uber Engineering can be found&nbsp;here. If message processing latency is not an issue, the vanilla Kafka solution with adequate error monitoring might suffice.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="563" height="331" src="https://eranstiller.com/wp-content/uploads/2020/02/RabbitMQ-vs-Kafka-Part-2-Fault-Handling-Kafka.svg" alt="An example of messages in a partition not handled if the consumer is stuck retrying a message" class="wp-image-2499"/><figcaption class="wp-element-caption">Messages in the bottom partition are not handled if the consumer is stuck retrying a message.</figcaption></figure>
</div>


<p><strong><em>Winner&nbsp;</em></strong><em>&#8211; RabbitMQ is a winner on points since it provides some mechanism to solve this problem out of the box.&nbsp;</em></p>



<h3 class="wp-block-heading">Scale</h3>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="698" src="https://eranstiller.com/wp-content/uploads/2020/02/graphic-node-iLKK0eFTywU-unsplash-1024x698.jpg" alt="" class="wp-image-2517" srcset="https://eranstiller.com/wp-content/uploads/2020/02/graphic-node-iLKK0eFTywU-unsplash-1024x698.jpg 1024w, https://eranstiller.com/wp-content/uploads/2020/02/graphic-node-iLKK0eFTywU-unsplash-300x204.jpg 300w, https://eranstiller.com/wp-content/uploads/2020/02/graphic-node-iLKK0eFTywU-unsplash-768x523.jpg 768w, https://eranstiller.com/wp-content/uploads/2020/02/graphic-node-iLKK0eFTywU-unsplash-1536x1046.jpg 1536w, https://eranstiller.com/wp-content/uploads/2020/02/graphic-node-iLKK0eFTywU-unsplash-2048x1395.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption"> Photo by&nbsp;<a href="https://unsplash.com/@graphicnode?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" target="_blank" rel="noopener">Graphic Node</a>&nbsp;on&nbsp;<a href="https://unsplash.com/s/photos/scale?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" target="_blank" rel="noopener">Unsplash</a></figcaption></figure>
</div>


<p>There are multiple benchmarks out there, checking the performance of RabbitMQ and Kafka. While generic benchmarks have limited applicability toward specific cases, Kafka generally performs better than RabbitMQ. Kafka uses sequential disk I/O to boost performance. Its architecture using partitions means it scales horizontally (scale-out) better than RabbitMQ, which scales better vertically (scale-up).</p>



<p>Large Kafka deployments can commonly handle hundreds of thousands of messages per second and even millions per second. Pivotal previously recorded a RabbitMQ cluster running&nbsp;one million messages per second; however, it did this on a 30-node cluster with load optimally spread across multiple queues and exchanges.</p>



<p>Typical RabbitMQ deployments include 3-7 node clusters that do not necessarily optimally divide the load between queues. These typical clusters can usually expect to handle a load of several tens of thousands of messages per second.</p>



<p><strong><em>Winner&nbsp;</em></strong><em>&#8211; while both platforms can handle massive loads, Kafka typically scales better and achieves</em> higher throughput than RabbitMQ, thus winning this round. However, it is essential to note that most systems never reach <em>these limitations! So unless you&#8217;re building the next millions-of-users smash-hit software system, you don&#8217;t need to care about scale so much, as both platforms can serve you well.</em></p>



<h3 class="wp-block-heading">Consumer Complexity</h3>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="683" src="https://eranstiller.com/wp-content/uploads/2020/02/john-barkiple-l090uFWoPaI-unsplash-1024x683.jpg" alt="" class="wp-image-2518" srcset="https://eranstiller.com/wp-content/uploads/2020/02/john-barkiple-l090uFWoPaI-unsplash-1024x683.jpg 1024w, https://eranstiller.com/wp-content/uploads/2020/02/john-barkiple-l090uFWoPaI-unsplash-300x200.jpg 300w, https://eranstiller.com/wp-content/uploads/2020/02/john-barkiple-l090uFWoPaI-unsplash-768x512.jpg 768w, https://eranstiller.com/wp-content/uploads/2020/02/john-barkiple-l090uFWoPaI-unsplash-1536x1024.jpg 1536w, https://eranstiller.com/wp-content/uploads/2020/02/john-barkiple-l090uFWoPaI-unsplash-2048x1365.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption"> Photo by&nbsp;<a href="https://unsplash.com/@barkiple?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" target="_blank" rel="noopener">John Barkiple</a>&nbsp;on&nbsp;<a href="https://unsplash.com/s/photos/complex?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" target="_blank" rel="noopener">Unsplash</a> </figcaption></figure>
</div>


<p>RabbitMQ uses a smart-broker &amp; dumb-consumer approach. Consumers register to consume queues, and RabbitMQ pushes them with messages to process as they come in. RabbitMQ also has a pull API, but is much less used. </p>



<p>RabbitMQ manages the distribution of messages to consumers and removes messages from queues (possibly to DLXs). The consumer does not need to worry about any of this. RabbitMQ&#8217;s structure also means that a queue&#8217;s consumer group can efficiently scale from just one consumer to multiple consumers when the load increases without any changes to the system.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="732" height="851" src="https://eranstiller.com/wp-content/uploads/2020/02/RabbitMQ-vs-Kafka-Part-2-Scaling-RabbitMQ.svg" alt="An illustration of RabbitMQ consumers that efficiently scale-up and scale-down" class="wp-image-2525"/><figcaption class="wp-element-caption"> RabbitMQ consumers efficiently scale up and scale down. </figcaption></figure>
</div>


<p>Kafka, on the other hand, uses a dumb-broker &amp; smart-consumer approach. Consumers in a consumer group need to coordinate leases on topic partitions between them (so that only one consumer in a consumer group listens to a specific partition). Consumers also need to manage and store their partitions&#8217; offset index.</p>



<p>Fortunately, the Kafka SDK takes care of these for us, so we don&#8217;t need to manage it ourselves. However, when we have a low load, a single consumer needs to process and keep track of multiple partitions in parallel, which requires more resources on the consumer side.</p>



<p>Also, as the load increases, we can only scale the consumer group to the point where the number of consumers equals the number of partitions in the topic. Above that, we need to configure Kafka to add additional partitions. However, as the load decreases again &#8211; we cannot remove the partitions we already added, adding more to the work consumers need to do. Albeit, as mentioned above, the SDK handles this extra work.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="812" height="1100" src="https://eranstiller.com/wp-content/uploads/2020/02/RabbitMQ-vs-Kafka-Part-2-Scaling-Kafka.svg" alt="An illustration of Kafka partitions that cannot be removed, leaving consumers with more work after scaling down" class="wp-image-2501"/><figcaption class="wp-element-caption">Kafka partitions cannot be removed, leaving consumers with more work after scaling down.</figcaption></figure>
</div>


<p><strong><em>Winner&nbsp;</em></strong><em>&#8211; RabbitMQ, by design, is built with dumb consumers in mind. As a result, it is the winner of this round.</em></p>



<h3 class="wp-block-heading">Protocol Compatibility</h3>



<p>While Apache Kafka uses a <a href="https://kafka.apache.org/protocol.html" data-type="link" data-id="https://kafka.apache.org/protocol.html" target="_blank" rel="noopener">custom binary protocol</a> over TCP, RabbitMQ supports <a href="https://www.rabbitmq.com/protocols.html" data-type="link" data-id="https://www.rabbitmq.com/protocols.html" target="_blank" rel="noopener">standard protocols</a> natively or via plugins. Most notably, RabbitMQ supports AMQP 0-9-1 out of the box. It adds support for AMQP 1.0, MQTT, and STOMP via plugins.</p>



<p><strong><em>Winner&nbsp;</em></strong><em>&#8211; RabbitMQ, as it supports various standard protocols.</em></p>



<h2 class="wp-block-heading">Which Platform Should You Use? RabbitMQ vs Kafka</h2>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="628" src="https://eranstiller.com/wp-content/uploads/2020/02/paulius-dragunas-Nhs0sLAn1Is-unsplash-1024x628.jpg" alt="" class="wp-image-2519" srcset="https://eranstiller.com/wp-content/uploads/2020/02/paulius-dragunas-Nhs0sLAn1Is-unsplash-1024x628.jpg 1024w, https://eranstiller.com/wp-content/uploads/2020/02/paulius-dragunas-Nhs0sLAn1Is-unsplash-300x184.jpg 300w, https://eranstiller.com/wp-content/uploads/2020/02/paulius-dragunas-Nhs0sLAn1Is-unsplash-768x471.jpg 768w, https://eranstiller.com/wp-content/uploads/2020/02/paulius-dragunas-Nhs0sLAn1Is-unsplash-1536x941.jpg 1536w, https://eranstiller.com/wp-content/uploads/2020/02/paulius-dragunas-Nhs0sLAn1Is-unsplash-2048x1255.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption"> Photo by&nbsp;<a href="https://unsplash.com/@paulius005?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" target="_blank" rel="noopener">Paulius Dragunas</a>&nbsp;on&nbsp;<a href="https://unsplash.com/s/photos/lighthouse?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" target="_blank" rel="noopener">Unsplash</a></figcaption></figure>
</div>


<p>Now we&#8217;re at the million-dollar question &#8211; when should we use RabbitMQ, and when should we use Kafka? If we summarize the above differences between the two, we arrive at the following conclusion:</p>



<ul class="wp-block-list">
<li>RabbitMQ is preferable when we need:
<ol class="wp-block-list">
<li>Advanced and flexible routing rules.</li>



<li>Message timing control (controlling either message expiry or message delay).</li>



<li>Advanced fault handling capabilities in cases when consumers are more likely to fail to process messages (either temporarily or permanently).</li>



<li>Simpler consumer implementations.</li>
</ol>
</li>



<li>Kafka is preferable when we require:
<ol class="wp-block-list">
<li>Strict message ordering.</li>



<li>Message retention for extended periods, including the possibility of replaying past messages.</li>



<li>The ability to reach a large scale when traditional solutions do not suffice.</li>
</ol>
</li>
</ul>



<p>We can implement most use cases using both platforms. However, as solution architects, we must choose the most suitable tool for the job. When making this choice, we should consider both functional differences, as highlighted above, and non-functional constraints. These constraints include things such as:</p>



<ol class="wp-block-list">
<li>Existing developer knowledge of these platforms.</li>



<li>Availability of a managed cloud solution if applicable.</li>



<li>The operational cost of each solution.</li>



<li>Availability of SDKs for our target stack.</li>
</ol>



<p>When developing complex software systems, we might be tempted to implement all required messaging use cases using the same platform. Nevertheless, from my experience, more often than not, using both platforms can have many benefits. </p>



<p>For example, in an event-driven architecture-based system, we could use RabbitMQ to send commands between microservices and use Kafka to implement business event notifications. This is because event notifications are often used for event sourcing, batch operations (ETL style), or audit purposes, thus making Kafka very valuable for its message retention capabilities.</p>



<p>Commands, on the other hand, typically require additional processing on the consumer side, processing that could fail and need advanced fault-handling capabilities. Here, RabbitMQ shines for its capabilities. I might write a detailed post on it in the future, but you must remember &#8211; your mileage may vary, as suitability depends on your specific requirements.</p>



<h2 class="wp-block-heading">Closing Thoughts</h2>



<p>I started this post by observing that many developers view RabbitMQ and Kafka as interchangeable. I hope that reviewing their differences assisted in gaining insight into these platforms&#8217; implementation and technical uniqueness.</p>



<p>In the rapidly evolving landscape of messaging platforms, RabbitMQ and Kafka stand out as formidable choices, each with its own strengths and specializations.</p>



<p>RabbitMQ&#8217;s advanced routing capabilities and message timing features make it particularly versatile in various enterprise settings. On the other hand, Kafka&#8217;s proficiency in handling vast real-time data streams and its robust scaling mechanisms underscores its value in web-scale applications.</p>



<p>As with many technological decisions, the optimal choice boils down to the specific needs and goals of the project at hand. Both platforms are powerful in their right, and understanding their nuances can significantly inform the direction of your software design and development endeavors.</p>
<p>The post <a rel="nofollow" href="https://eranstiller.com/rabbitmq-vs-kafka">RabbitMQ vs Kafka: Which Platform to Choose in 2023?</a> appeared first on <a rel="nofollow" href="https://eranstiller.com">Eran Stiller</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://eranstiller.com/rabbitmq-vs-kafka/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>What Is the JavaScript Double Question Marks (??) Operator?</title>
		<link>https://eranstiller.com/javascript-double-question-marks</link>
					<comments>https://eranstiller.com/javascript-double-question-marks#comments</comments>
		
		<dc:creator><![CDATA[Eran Stiller]]></dc:creator>
		<pubDate>Sun, 24 Sep 2023 07:41:37 +0000</pubDate>
				<category><![CDATA[Software Development]]></category>
		<guid isPermaLink="false">https://eranstiller.com/?p=3727</guid>

					<description><![CDATA[<p>Have you ever encountered double question marks (??) in JavaScript code and wondered what they were? Did someone tell you about the Nullish Coalescing Operator, and you didn&#8217;t know what it meant? Or were you just wondering when you can use this operator to make your code more readable? Well, wonder no more. You&#8217;re about...</p>
<p>The post <a rel="nofollow" href="https://eranstiller.com/javascript-double-question-marks">What Is the JavaScript Double Question Marks (??) Operator?</a> appeared first on <a rel="nofollow" href="https://eranstiller.com">Eran Stiller</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Have you ever encountered double question marks (??) in JavaScript code and wondered what they were? Did someone tell you about the Nullish Coalescing Operator, and you didn&#8217;t know what it meant? Or were you just wondering when you can use this operator to make your code more readable? Well, wonder no more.</p>



<p>You&#8217;re about to demystify <strong>JavaScript&#8217;s double question marks</strong> (??), also known as the <strong>Nullish Coalescing Operator</strong>. It may seem odd, but it&#8217;s extremely handy when working with potential null or undefined values.</p>



<p>It allows you to use the default value and prevent unexpected code behaviors.</p>



<p>Brace yourself, as you&#8217;ll learn how it interacts with the optional chaining operator and when to use it effectively.</p>



<p>By the end, you&#8217;ll be a pro at using this powerful operator in JavaScript.</p>


<div class="kb-row-layout-wrap kb-row-layout-id3727_3a8874-21 alignnone wp-block-kadence-rowlayout"><div class="kt-row-column-wrap kt-has-1-columns kt-row-layout-equal kt-tab-layout-inherit kt-mobile-layout-row kt-row-valign-top">

<div class="wp-block-kadence-column kadence-column3727_896fb9-3b inner-column-1"><div class="kt-inside-inner-col">
<h2 class="wp-block-heading">Key Takeaways</h2>



<ul class="wp-block-list">
<li>The nullish coalescing operator returns a default value when the left-hand side operand is null or undefined.</li>



<li>It helps provide fallback values in case of null or undefined values.</li>



<li>The nullish coalescing operator has higher precedence than the conditional (ternary) operator.</li>



<li>It can be combined with the optional chaining operator to access a property with a fallback value safely.</li>



<li>It can be replaced with the nullish coalescing assignment operator (??=) to make the initialization code even more concise.</li>
</ul>
</div></div>

</div></div>




<h2 class="wp-block-heading">What Is JavaScript Double Question Marks (??) Operator?</h2>



<p>This JavaScript Double Question Marks operator kicks in to provide a default value when the left-hand side operand, or the first operand, turns out to be <code>null</code> or <code>undefined</code>. This is especially useful when dealing with variables that may not have been initialized.</p>



<div class="wp-block-kadence-image kb-image3727_ee3d22-b5"><figure class="aligncenter size-large"><a href="https://eranstiller.com/wp-content/uploads/2023/09/JavaScript-Double-Question-Mark-Flow-1.png" class="kb-advanced-image-link"><img loading="lazy" decoding="async" width="1024" height="455" src="https://eranstiller.com/wp-content/uploads/2023/09/JavaScript-Double-Question-Mark-Flow-1-1024x455.png" alt="A flow diagram showing the JavaScript double question marks operator sequence." class="kb-img wp-image-3733" srcset="https://eranstiller.com/wp-content/uploads/2023/09/JavaScript-Double-Question-Mark-Flow-1-1024x455.png 1024w, https://eranstiller.com/wp-content/uploads/2023/09/JavaScript-Double-Question-Mark-Flow-1-300x133.png 300w, https://eranstiller.com/wp-content/uploads/2023/09/JavaScript-Double-Question-Mark-Flow-1-768x341.png 768w, https://eranstiller.com/wp-content/uploads/2023/09/JavaScript-Double-Question-Mark-Flow-1.png 1242w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a><figcaption>JavaScript Double Questions Marks Flowchart</figcaption></figure></div>



<p>Below is an example that translates the above behavior into JavaScript code.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="const firstName = null;
const lastName = undefined;
const suffix = &quot;Junior&quot;
const nickname = &quot;SuperCoder&quot;;

// If firstName is null or undefined, use the value of nickname
let displayName = firstName ?? nickname;
console.log(displayName);  // Output: SuperCoder

// If lastName is null or undefined, use the value of nickname
displayName = lastName ?? nickname;
console.log(displayName);  // Output: SuperCoder

// If suffix is null or undefined, use the hard-coded value
displayName = suffix ?? &quot;&quot;;
console.log(displayName);  // Output: Junior" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">const</span><span style="color: #F6F6F4"> firstName </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">null</span><span style="color: #F6F6F4">;</span></span>
<span class="line"><span style="color: #F286C4">const</span><span style="color: #F6F6F4"> lastName </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">undefined</span><span style="color: #F6F6F4">;</span></span>
<span class="line"><span style="color: #F286C4">const</span><span style="color: #F6F6F4"> suffix </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Junior</span><span style="color: #DEE492">&quot;</span></span>
<span class="line"><span style="color: #F286C4">const</span><span style="color: #F6F6F4"> nickname </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">SuperCoder</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B7F8B">// If firstName is null or undefined, use the value of nickname</span></span>
<span class="line"><span style="color: #F286C4">let</span><span style="color: #F6F6F4"> displayName </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> firstName </span><span style="color: #F286C4">??</span><span style="color: #F6F6F4"> nickname;</span></span>
<span class="line"><span style="color: #F6F6F4">console.</span><span style="color: #62E884">log</span><span style="color: #F6F6F4">(displayName);  </span><span style="color: #7B7F8B">// Output: SuperCoder</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B7F8B">// If lastName is null or undefined, use the value of nickname</span></span>
<span class="line"><span style="color: #F6F6F4">displayName </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> lastName </span><span style="color: #F286C4">??</span><span style="color: #F6F6F4"> nickname;</span></span>
<span class="line"><span style="color: #F6F6F4">console.</span><span style="color: #62E884">log</span><span style="color: #F6F6F4">(displayName);  </span><span style="color: #7B7F8B">// Output: SuperCoder</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B7F8B">// If suffix is null or undefined, use the hard-coded value</span></span>
<span class="line"><span style="color: #F6F6F4">displayName </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> suffix </span><span style="color: #F286C4">??</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&quot;&quot;</span><span style="color: #F6F6F4">;</span></span>
<span class="line"><span style="color: #F6F6F4">console.</span><span style="color: #62E884">log</span><span style="color: #F6F6F4">(displayName);  </span><span style="color: #7B7F8B">// Output: Junior</span></span></code></pre></div>



<p>If you were to write the above code using standard <code>if</code> statements, it would become much more lengthy and unreadable. The example below uses an <code>if</code> statement and the ternary operator to accomplish the same result.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="const firstName = null;
const lastName = undefined;
const nickname = &quot;SuperCoder&quot;;

// Here's how you would do the above checks without the nullish coalescing operator
let displayName;
if (firstName !== null &amp;&amp; firstName !== undefined) {
  displayName = firstName;
} else {
  displayName = nickname;
}
console.log(displayName);  // Output: SuperCoder

displayName = (lastName !== null &amp;&amp; lastName !== undefined) ? lastName : nickname;
console.log(displayName);  // Output: SuperCoder" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">const</span><span style="color: #F6F6F4"> firstName </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">null</span><span style="color: #F6F6F4">;</span></span>
<span class="line"><span style="color: #F286C4">const</span><span style="color: #F6F6F4"> lastName </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">undefined</span><span style="color: #F6F6F4">;</span></span>
<span class="line"><span style="color: #F286C4">const</span><span style="color: #F6F6F4"> nickname </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">SuperCoder</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B7F8B">// Here&#39;s how you would do the above checks without the nullish coalescing operator</span></span>
<span class="line"><span style="color: #F286C4">let</span><span style="color: #F6F6F4"> displayName;</span></span>
<span class="line"><span style="color: #F286C4">if</span><span style="color: #F6F6F4"> (firstName </span><span style="color: #F286C4">!==</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">null</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">&amp;&amp;</span><span style="color: #F6F6F4"> firstName </span><span style="color: #F286C4">!==</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">undefined</span><span style="color: #F6F6F4">) {</span></span>
<span class="line"><span style="color: #F6F6F4">  displayName </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> firstName;</span></span>
<span class="line"><span style="color: #F6F6F4">} </span><span style="color: #F286C4">else</span><span style="color: #F6F6F4"> {</span></span>
<span class="line"><span style="color: #F6F6F4">  displayName </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> nickname;</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span>
<span class="line"><span style="color: #F6F6F4">console.</span><span style="color: #62E884">log</span><span style="color: #F6F6F4">(displayName);  </span><span style="color: #7B7F8B">// Output: SuperCoder</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">displayName </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> (lastName </span><span style="color: #F286C4">!==</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">null</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">&amp;&amp;</span><span style="color: #F6F6F4"> lastName </span><span style="color: #F286C4">!==</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">undefined</span><span style="color: #F6F6F4">) </span><span style="color: #F286C4">?</span><span style="color: #F6F6F4"> lastName </span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> nickname;</span></span>
<span class="line"><span style="color: #F6F6F4">console.</span><span style="color: #62E884">log</span><span style="color: #F6F6F4">(displayName);  </span><span style="color: #7B7F8B">// Output: SuperCoder</span></span></code></pre></div>



<p>The double question marks operator offers a reliable, concise way to set default values and avoid errors in your code. Remember, it&#8217;s all about preventing those pesky <code>null</code> or <code>undefined</code> values from causing havoc in your JavaScript programs.</p>



<h2 class="wp-block-heading">What is the JavaScript Null Coalescing Assignment (??=) Operator?</h2>



<p>The <strong>Nullish Coalescing Assignment</strong> (<code>??=</code>) operator is a logical operator that only assigns a new value to a variable if that variable is <code>null</code> or <code>undefined</code>. It&#8217;s a shorthand for the Null Coalescing Operator (<code>??</code>) that can be pretty useful in many situations where a default value must only be set if a variable hasn&#8217;t already been initialized.</p>



<div class="wp-block-kadence-image kb-image3727_ef1ae8-0e"><figure class="aligncenter size-large"><a href="https://eranstiller.com/wp-content/uploads/2023/09/JavaScript-Null-Coalescing-Assignment-Flow-1.png" class="kb-advanced-image-link"><img loading="lazy" decoding="async" width="1024" height="455" src="https://eranstiller.com/wp-content/uploads/2023/09/JavaScript-Null-Coalescing-Assignment-Flow-1-1024x455.png" alt="A flowchart depicting how the Null Coalescing Assignment Operator works." class="kb-img wp-image-3732" srcset="https://eranstiller.com/wp-content/uploads/2023/09/JavaScript-Null-Coalescing-Assignment-Flow-1-1024x455.png 1024w, https://eranstiller.com/wp-content/uploads/2023/09/JavaScript-Null-Coalescing-Assignment-Flow-1-300x133.png 300w, https://eranstiller.com/wp-content/uploads/2023/09/JavaScript-Null-Coalescing-Assignment-Flow-1-768x341.png 768w, https://eranstiller.com/wp-content/uploads/2023/09/JavaScript-Null-Coalescing-Assignment-Flow-1.png 1242w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a><figcaption>The Null Coalescing Assignment Operator Flowchart</figcaption></figure></div>



<p>Here&#8217;s a basic example demonstrating the <code>??=</code> operator:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="let firstName = getFirstName();
firstName ??= &quot;SuperCoder&quot;;" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">let</span><span style="color: #F6F6F4"> firstName </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">getFirstName</span><span style="color: #F6F6F4">();</span></span>
<span class="line"><span style="color: #F6F6F4">firstName </span><span style="color: #F286C4">??=</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">SuperCoder</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">;</span></span></code></pre></div>



<p>This operator is convenient when handling missing function arguments. I&#8217;ll cover this scenario in the section below.</p>



<h2 class="wp-block-heading">When Should I Use the JavaScript Double Question Marks Operator?</h2>



<p>You should use the JavaScript double question marks operator when you want to assign a default value in case the initial value is <code>null</code> or <code>undefined</code>.</p>



<p>It&#8217;s convenient when you&#8217;re accessing properties of an object that might not exist.</p>



<p>This operator allows you to write cleaner, more efficient code, reducing the risk of unexpected behaviors caused by <code>null</code> or <code>undefined</code> values.</p>



<h3 class="wp-block-heading">Default Value Assignment</h3>



<p>In the context of default value assignment, it&#8217;s beneficial to use the JavaScript double question marks operator when you want to assign a fallback value to a variable that might be <code>null</code> or <code>undefined</code>. With the double question marks operator, you can streamline this process.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="const result = yourVariable ?? 'defaultValue';" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">const</span><span style="color: #F6F6F4"> result </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> yourVariable </span><span style="color: #F286C4">??</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">defaultValue</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">;</span></span></code></pre></div>



<p>If <code>yourVariable</code> is <code>null</code> or <code>undefined</code>, <code>result</code> will automatically be set to <code>defaultValue</code>. It&#8217;s a more efficient, readable way to handle default value assignments in JavaScript.</p>



<h3 class="wp-block-heading">Handling Missing Function Arguments</h3>



<p>You can use the JavaScript double question marks operator to handle missing function arguments within the function body.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="function myFunction(argA, argB) {
  argA = argA ?? 'A';
  argB = argB ?? 'B';
  
  // Do something
}" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">function</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">myFunction</span><span style="color: #F6F6F4">(</span><span style="color: #FFB86C; font-style: italic">argA</span><span style="color: #F6F6F4">, </span><span style="color: #FFB86C; font-style: italic">argB</span><span style="color: #F6F6F4">) {</span></span>
<span class="line"><span style="color: #F6F6F4">  argA </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> argA </span><span style="color: #F286C4">??</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">A</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">;</span></span>
<span class="line"><span style="color: #F6F6F4">  argB </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> argB </span><span style="color: #F286C4">??</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">B</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">;</span></span>
<span class="line"><span style="color: #F6F6F4">  </span></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #7B7F8B">// Do something</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre></div>



<p>The above code can be shortened even further using the Null Coalescing Assignment:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="function myFunction(argA, argB) {
  argA ??= 'A';
  argB ??= 'B';
  
  // Do something
}" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">function</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">myFunction</span><span style="color: #F6F6F4">(</span><span style="color: #FFB86C; font-style: italic">argA</span><span style="color: #F6F6F4">, </span><span style="color: #FFB86C; font-style: italic">argB</span><span style="color: #F6F6F4">) {</span></span>
<span class="line"><span style="color: #F6F6F4">  argA </span><span style="color: #F286C4">??=</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">A</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">;</span></span>
<span class="line"><span style="color: #F6F6F4">  argB </span><span style="color: #F286C4">??=</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">B</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">;</span></span>
<span class="line"><span style="color: #F6F6F4">  </span></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #7B7F8B">// Do something</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre></div>



<p>This allows you to write code that provides more predictable results and minimizes edge cases where function callers can&#8217;t or won&#8217;t provide all the arguments.</p>



<h3 class="wp-block-heading">Accessing Object Properties</h3>



<p>Interestingly, when accessing object properties that might be undefined, it&#8217;s much safer to use the JavaScript double question marks operator combined with the <strong>Optional Chaining Operator</strong> (<code>?.</code>). </p>



<p>Suppose you have a complex object, and you&#8217;re unsure whether a property exists or not. Instead of risking a TypeError, you utilize the optional chaining operator to access properties. However, you&#8217;d get an undefined result if the property is undefined.</p>



<p>That&#8217;s where the double question marks come into play. You can set a default value that&#8217;ll be returned if the property is undefined.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="const user = {
  profile: {
    name: &quot;John Doe&quot;,
    age: 30,
    address: {
      city: &quot;New York&quot;,
      country: &quot;USA&quot;
    }
  }
};

// Safe access to deeply nested properties using optional chaining and nullish coalescing
const city = user?.profile?.address?.city ?? &quot;Default City&quot;;
console.log(city);  // Output: New York

// If any of the nested properties are null or undefined, the default value will be used
const postalCode = user?.profile?.address?.postalCode ?? &quot;00000&quot;;
console.log(postalCode);  // Output: 00000" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">const</span><span style="color: #F6F6F4"> user </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> {</span></span>
<span class="line"><span style="color: #F6F6F4">  profile</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> {</span></span>
<span class="line"><span style="color: #F6F6F4">    name</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">John Doe</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">,</span></span>
<span class="line"><span style="color: #F6F6F4">    age</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">30</span><span style="color: #F6F6F4">,</span></span>
<span class="line"><span style="color: #F6F6F4">    address</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> {</span></span>
<span class="line"><span style="color: #F6F6F4">      city</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">New York</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">,</span></span>
<span class="line"><span style="color: #F6F6F4">      country</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">USA</span><span style="color: #DEE492">&quot;</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"><span style="color: #F6F6F4">  }</span></span>
<span class="line"><span style="color: #F6F6F4">};</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B7F8B">// Safe access to deeply nested properties using optional chaining and nullish coalescing</span></span>
<span class="line"><span style="color: #F286C4">const</span><span style="color: #F6F6F4"> city </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> user?.profile?.address?.city </span><span style="color: #F286C4">??</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Default City</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">;</span></span>
<span class="line"><span style="color: #F6F6F4">console.</span><span style="color: #62E884">log</span><span style="color: #F6F6F4">(city);  </span><span style="color: #7B7F8B">// Output: New York</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B7F8B">// If any of the nested properties are null or undefined, the default value will be used</span></span>
<span class="line"><span style="color: #F286C4">const</span><span style="color: #F6F6F4"> postalCode </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> user?.profile?.address?.postalCode </span><span style="color: #F286C4">??</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">00000</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">;</span></span>
<span class="line"><span style="color: #F6F6F4">console.</span><span style="color: #62E884">log</span><span style="color: #F6F6F4">(postalCode);  </span><span style="color: #7B7F8B">// Output: 00000</span></span></code></pre></div>



<p>Using the double questions mark operator is a clean, concise way to ensure you access object properties safely in JavaScript.</p>



<h2 class="wp-block-heading">Why JavaScript Needed the Double Question Marks Operator?</h2>



<p>JavaScript needed the double question marks operator to provide a robust solution for handling the two specific cases of <code>null</code> and <code>undefined</code> values. </p>



<p>Before the introduction of the Nullish Coalescing Operator (<code>??</code>), developers often used the <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_OR" target="_blank" rel="noopener">logical OR (<code>||</code>)</a> operator to provide default values. However, this approach has a significant drawback: it considers all <strong>falsy </strong>values (<code>false</code>, <code>0</code>, <code>''</code>, <code>NaN</code>, <code>null</code>, <code>undefined</code>) as equivalent for the purposes of providing a default value. In many cases, this behavior isn&#8217;t desired, as <code>false</code>, <code>0</code>, empty string, etc., are legitimate values that shouldn&#8217;t trigger the use of a default value.</p>



<p>The following code illustrates the drawbacks of using a logical OR:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="const options = {
  isPrivate: false,
  maxParticipants: 0,
};

// Using the logical OR (`||`) operator:
const isPrivate = options.isPrivate || true;  // undesired result: true
const maxParticipants = options.maxParticipants || 10;  // undesired result: 10

console.log(isPrivate);  // Output: true
console.log(maxParticipants);  // Output: 10

// Using the nullish coalescing operator (`??`):
const isPrivateCorrect = options.isPrivate ?? true;  // desired result: false
const maxParticipantsCorrect = options.maxParticipants ?? 10;  // desired result: 0

console.log(isPrivateCorrect);  // Output: false
console.log(maxParticipantsCorrect);  // Output: 0" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">const</span><span style="color: #F6F6F4"> options </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> {</span></span>
<span class="line"><span style="color: #F6F6F4">  isPrivate</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">false</span><span style="color: #F6F6F4">,</span></span>
<span class="line"><span style="color: #F6F6F4">  maxParticipants</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">0</span><span style="color: #F6F6F4">,</span></span>
<span class="line"><span style="color: #F6F6F4">};</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B7F8B">// Using the logical OR (`||`) operator:</span></span>
<span class="line"><span style="color: #F286C4">const</span><span style="color: #F6F6F4"> isPrivate </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> options.isPrivate </span><span style="color: #F286C4">||</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">true</span><span style="color: #F6F6F4">;  </span><span style="color: #7B7F8B">// undesired result: true</span></span>
<span class="line"><span style="color: #F286C4">const</span><span style="color: #F6F6F4"> maxParticipants </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> options.maxParticipants </span><span style="color: #F286C4">||</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">10</span><span style="color: #F6F6F4">;  </span><span style="color: #7B7F8B">// undesired result: 10</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">console.</span><span style="color: #62E884">log</span><span style="color: #F6F6F4">(isPrivate);  </span><span style="color: #7B7F8B">// Output: true</span></span>
<span class="line"><span style="color: #F6F6F4">console.</span><span style="color: #62E884">log</span><span style="color: #F6F6F4">(maxParticipants);  </span><span style="color: #7B7F8B">// Output: 10</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B7F8B">// Using the nullish coalescing operator (`??`):</span></span>
<span class="line"><span style="color: #F286C4">const</span><span style="color: #F6F6F4"> isPrivateCorrect </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> options.isPrivate </span><span style="color: #F286C4">??</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">true</span><span style="color: #F6F6F4">;  </span><span style="color: #7B7F8B">// desired result: false</span></span>
<span class="line"><span style="color: #F286C4">const</span><span style="color: #F6F6F4"> maxParticipantsCorrect </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> options.maxParticipants </span><span style="color: #F286C4">??</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">10</span><span style="color: #F6F6F4">;  </span><span style="color: #7B7F8B">// desired result: 0</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">console.</span><span style="color: #62E884">log</span><span style="color: #F6F6F4">(isPrivateCorrect);  </span><span style="color: #7B7F8B">// Output: false</span></span>
<span class="line"><span style="color: #F6F6F4">console.</span><span style="color: #62E884">log</span><span style="color: #F6F6F4">(maxParticipantsCorrect);  </span><span style="color: #7B7F8B">// Output: 0</span></span></code></pre></div>



<p>In this example, <code>isPrivate</code> and <code>maxParticipants</code> are valid options with falsy values (<code>false</code> and <code>0</code>, respectively). When using the <code>||</code> operator to provide default values, these falsy values are wrongly interpreted as triggers for default values.</p>



<p>With the <code>??</code> operator, the original falsy values are correctly preserved, as <code>??</code> only considers <code>null</code> or <code>undefined</code> as triggers for default values. This allows for more accurate, intuitive, and safer default value assignment, making the <code>??</code> operator a valuable addition to the language for developers.</p>



<h2 class="wp-block-heading">Frequently Asked Questions</h2>



<h3 class="wp-block-heading">How Does the Nullish Coalescing Operator Differ From the Logical OR Operator in Javascript?</h3>



<p>JavaScript&#8217;s Nullish Coalescing Operator (<code>??</code>) differs from the logical OR (<code>||</code>) by only returning the right operand if the left one is <code>null</code> or <code>undefined</code>, not on other falsy values like 0 or <code>""</code>.</p>



<h3 class="wp-block-heading">What Is the Operator Precedence of the Nullish Coalescing Operator in Javascript?</h3>



<p>In JavaScript, the Nullish Coalescing Operator (<code>??</code>) <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_precedence" target="_blank" rel="noopener">ranks third-lowest in operator precedence</a>. It&#8217;s lower than logical AND (<code>&amp;&amp;</code>), has the same precedence as the logical OR (<code>||</code>), but higher priority than the assignment (<code>=</code>) and ternary (<code>?:</code>) operators.</p>



<p>To indicate precedence with JavaScript&#8217;s Nullish Coalescing Operator, use parentheses. Here are a few examples.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="let a = false;
let b = null;
let c = true;

// Using parentheses to indicate precedence:
let result = (a ?? b) || c; // evaluates as (false) || true = true
console.log(result);  // Output: true

result = a ?? (b || c); // evaluates as false ?? (null || true) = false ?? true = false
console.log(result);  // Output: false" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">let</span><span style="color: #F6F6F4"> a </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">false</span><span style="color: #F6F6F4">;</span></span>
<span class="line"><span style="color: #F286C4">let</span><span style="color: #F6F6F4"> b </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">null</span><span style="color: #F6F6F4">;</span></span>
<span class="line"><span style="color: #F286C4">let</span><span style="color: #F6F6F4"> c </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">true</span><span style="color: #F6F6F4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B7F8B">// Using parentheses to indicate precedence:</span></span>
<span class="line"><span style="color: #F286C4">let</span><span style="color: #F6F6F4"> result </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> (a </span><span style="color: #F286C4">??</span><span style="color: #F6F6F4"> b) </span><span style="color: #F286C4">||</span><span style="color: #F6F6F4"> c; </span><span style="color: #7B7F8B">// evaluates as (false) || true = true</span></span>
<span class="line"><span style="color: #F6F6F4">console.</span><span style="color: #62E884">log</span><span style="color: #F6F6F4">(result);  </span><span style="color: #7B7F8B">// Output: true</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">result </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> a </span><span style="color: #F286C4">??</span><span style="color: #F6F6F4"> (b </span><span style="color: #F286C4">||</span><span style="color: #F6F6F4"> c); </span><span style="color: #7B7F8B">// evaluates as false ?? (null || true) = false ?? true = false</span></span>
<span class="line"><span style="color: #F6F6F4">console.</span><span style="color: #62E884">log</span><span style="color: #F6F6F4">(result);  </span><span style="color: #7B7F8B">// Output: false</span></span></code></pre></div>



<h4 class="wp-block-heading">How Does the Nullish Coalescing Operator Handle Non-Null and Non-Undefined Values?</h4>



<p>If you&#8217;re dealing with non-null and non-undefined values, the JavaScript double question marks (<code>??</code>) operator returns the left-hand value. It&#8217;s only when it&#8217;s <code>null</code> or <code>undefined</code>, it defaults to the right-hand side value.</p>



<h3 class="wp-block-heading">Can the Nullish Coalescing Operator Be Combined With Other Operators Besides the Optional Chaining Operator?</h3>



<p>You can combine the nullish coalescing operator (??) with other operators. However, due to its relatively low precedence, you&#8217;ll need to use parentheses to dictate the order of operations to avoid unexpected results.</p>



<p>You should note that this operator doesn&#8217;t have associativity with other operators, which could cause exceptions. For example:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="let a = false;
let b = null;
let c = true;

// Due to the lack of associativity, this will throw a SyntaxError
result = a ?? b || c;" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">let</span><span style="color: #F6F6F4"> a </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">false</span><span style="color: #F6F6F4">;</span></span>
<span class="line"><span style="color: #F286C4">let</span><span style="color: #F6F6F4"> b </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">null</span><span style="color: #F6F6F4">;</span></span>
<span class="line"><span style="color: #F286C4">let</span><span style="color: #F6F6F4"> c </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">true</span><span style="color: #F6F6F4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B7F8B">// Due to the lack of associativity, this will throw a SyntaxError</span></span>
<span class="line"><span style="color: #F6F6F4">result </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> a </span><span style="color: #F286C4">??</span><span style="color: #F6F6F4"> b </span><span style="color: #F286C4">||</span><span style="color: #F6F6F4"> c;</span></span></code></pre></div>



<h3 class="wp-block-heading">Is the Double Question Marks Operator Available in TypeScript?</h3>



<p>The double question marks operator has been available in TypeScript since version 3.7. Here is an example of code usage.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="type User = {
    name: string | null;
    age?: number;
};

const user: User = {
    name: null,
};

// Use the nullish coalescing operator to provide default values
const userName: string = user.name ?? 'Default Name';
const userAge: number = user.age ?? 18;

console.log(userName);  // Output: Default Name
console.log(userAge);  // Output: 18" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">type</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">User</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> {</span></span>
<span class="line"><span style="color: #F6F6F4">    name</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">string</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">|</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">null</span><span style="color: #F6F6F4">;</span></span>
<span class="line"><span style="color: #F6F6F4">    age</span><span style="color: #F286C4">?:</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">number</span><span style="color: #F6F6F4">;</span></span>
<span class="line"><span style="color: #F6F6F4">};</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">const</span><span style="color: #F6F6F4"> user</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">User</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> {</span></span>
<span class="line"><span style="color: #F6F6F4">    name</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">null</span><span style="color: #F6F6F4">,</span></span>
<span class="line"><span style="color: #F6F6F4">};</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B7F8B">// Use the nullish coalescing operator to provide default values</span></span>
<span class="line"><span style="color: #F286C4">const</span><span style="color: #F6F6F4"> userName</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">string</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> user.name </span><span style="color: #F286C4">??</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">Default Name</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">;</span></span>
<span class="line"><span style="color: #F286C4">const</span><span style="color: #F6F6F4"> userAge</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">number</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> user.age </span><span style="color: #F286C4">??</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">18</span><span style="color: #F6F6F4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">console.</span><span style="color: #62E884">log</span><span style="color: #F6F6F4">(userName);  </span><span style="color: #7B7F8B">// Output: Default Name</span></span>
<span class="line"><span style="color: #F6F6F4">console.</span><span style="color: #62E884">log</span><span style="color: #F6F6F4">(userAge);  </span><span style="color: #7B7F8B">// Output: 18</span></span></code></pre></div>



<h2 class="wp-block-heading">Conclusion</h2>



<p>In conclusion, the JavaScript double question marks operator is a versatile tool in your coding arsenal. It helps handle <code>null</code> or <code>undefined</code> values seamlessly, assigning default values and preventing unexpected behaviors.</p>



<p>Coupled with the optional chaining operator, it ensures safe access to object properties.</p>



<p>So, dive in, practice, and use this operator in your JavaScript or TypeScript coding experience. You can also learn other handy tricks, such as <a href="https://eranstiller.com/javascript-multiline-strings" data-type="post" data-id="3703">working with multiline strings in JavaScript</a>.</p>



<p>It&#8217;s time to code smarter, not harder!</p>
<p>The post <a rel="nofollow" href="https://eranstiller.com/javascript-double-question-marks">What Is the JavaScript Double Question Marks (??) Operator?</a> appeared first on <a rel="nofollow" href="https://eranstiller.com">Eran Stiller</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://eranstiller.com/javascript-double-question-marks/feed</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Top 4 Ways to Create JavaScript Multiline Strings</title>
		<link>https://eranstiller.com/javascript-multiline-strings</link>
					<comments>https://eranstiller.com/javascript-multiline-strings#respond</comments>
		
		<dc:creator><![CDATA[Eran Stiller]]></dc:creator>
		<pubDate>Sun, 17 Sep 2023 06:49:09 +0000</pubDate>
				<category><![CDATA[Software Development]]></category>
		<guid isPermaLink="false">https://eranstiller.com/?p=3703</guid>

					<description><![CDATA[<p>Did you ever need to work with long strings in JavaScript? Did you feel the code looks like a mess, whatever you try? Well, you&#8217;re not alone. It&#8217;s time you learned the ropes. In this handy guide, you&#8217;ll discover four straightforward ways to create multiline strings in JavaScript. We&#8217;ll untangle the complexities, simplifying the process...</p>
<p>The post <a rel="nofollow" href="https://eranstiller.com/javascript-multiline-strings">Top 4 Ways to Create JavaScript Multiline Strings</a> appeared first on <a rel="nofollow" href="https://eranstiller.com">Eran Stiller</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Did you ever need to work with long strings in JavaScript? Did you feel the code looks like a mess, whatever you try? Well, you&#8217;re not alone. It&#8217;s time you learned the ropes.</p>



<p>In this handy guide, you&#8217;ll discover four straightforward ways to create multiline strings in JavaScript. We&#8217;ll untangle the complexities, simplifying the process for you.</p>



<p>So, let&#8217;s dive right in and make your coding journey a lot smoother.</p>


<div class="kb-row-layout-wrap kb-row-layout-id3703_8b49cb-aa alignnone wp-block-kadence-rowlayout"><div class="kt-row-column-wrap kt-has-1-columns kt-row-layout-equal kt-tab-layout-inherit kt-mobile-layout-row kt-row-valign-top">

<div class="wp-block-kadence-column kadence-column3703_942633-3c inner-column-1"><div class="kt-inside-inner-col">
<h2 class="wp-block-heading">Key Takeaways</h2>



<ul class="wp-block-list">
<li>JavaScript multiline strings make code easier to read and maintain.</li>



<li>Multiline strings are handy when dealing with large blocks of text and eliminate the need for writing multiple strings separated by &#8220;+&#8221;.</li>



<li>Template literals in ES6 provide a more efficient and cleaner way to create multiline strings.</li>



<li>Backtick operators (<code>` `</code>) allow for easier formatting and multiline strings without escape sequences.</li>
</ul>
</div></div>

</div></div>




<h2 class="wp-block-heading">What are JavaScript Multiline Strings?</h2>



<p>JavaScript Multiline Strings is a way to write a string that spans multiple lines in your code, making it easier to read and maintain.</p>



<p>Understanding the use and implementation of multiline strings can significantly enhance your coding efficiency and neatness.</p>



<h3 class="wp-block-heading">Why Do You Need to Know JavaScript Multiline Strings?</h3>



<p>Multiline strings are handy when you&#8217;re dealing with large blocks of text. Instead of writing multiple strings separated by &#8220;+&#8221;, you can efficiently handle text over several lines. This not only makes your code cleaner but also improves readability.</p>



<p>There are several ways to create a multi-line. The traditional method uses a backslash at the end of a line. However, the introduction of template literals in ES6 now allows you to create JavaScript multiline strings using backticks. This new method is more efficient and cleaner, making it a popular choice among developers.</p>



<h2 class="wp-block-heading">How to Create JavaScript Multiline Strings?</h2>



<p>You can create multiline strings in JavaScript in several ways.</p>



<p>One approach is by using template literals, which allow you to embed expressions and create multiline strings easily.</p>



<p>Other methods include newline escaping, string concatenation, and array joining &#8211; each offering unique benefits.</p>



<h3 class="wp-block-heading">1. Use Template Literals</h3>



<p><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals" data-type="link" data-id="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals" target="_blank" rel="noopener">Template Literals</a> are an efficient, clean, well-documented way to create a multiline string. When you use template literals, you&#8217;re making your code more readable and less prone to errors.</p>



<p>Here&#8217;s a quick example: Instead of concatenating strings and inserting new line characters, you can wrap your text in backticks (`). This allows your JavaScript multiline string to span multiple lines without extra fuss.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="const multiLineString = `Apples
Bananas
Cherries`;

console.log(multiLineString);
/*
Outputs:
Apples
Bananas
Cherries
*/" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">const</span><span style="color: #F6F6F4"> multiLineString </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #E7EE98">`Apples</span></span>
<span class="line"><span style="color: #E7EE98">Bananas</span></span>
<span class="line"><span style="color: #E7EE98">Cherries`</span><span style="color: #F6F6F4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">console.</span><span style="color: #62E884">log</span><span style="color: #F6F6F4">(multiLineString);</span></span>
<span class="line"><span style="color: #7B7F8B">/*</span></span>
<span class="line"><span style="color: #7B7F8B">Outputs:</span></span>
<span class="line"><span style="color: #7B7F8B">Apples</span></span>
<span class="line"><span style="color: #7B7F8B">Bananas</span></span>
<span class="line"><span style="color: #7B7F8B">Cherries</span></span>
<span class="line"><span style="color: #7B7F8B">*/</span></span></code></pre></div>



<p>But what can you do if you want your code to have a multiline string but the output to include no newline breaks? In that case, use the Newline Escaping character to escape the newlines.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="const multiLineString = `Apples \
Bananas \
Cherries`;

console.log(multiLineString);
/*
Outputs:
Apples Bananas Cherries
*/" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">const</span><span style="color: #F6F6F4"> multiLineString </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #E7EE98">`Apples </span><span style="color: #F286C4">\</span></span>
<span class="line"><span style="color: #E7EE98">Bananas </span><span style="color: #F286C4">\</span></span>
<span class="line"><span style="color: #E7EE98">Cherries`</span><span style="color: #F6F6F4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">console.</span><span style="color: #62E884">log</span><span style="color: #F6F6F4">(multiLineString);</span></span>
<span class="line"><span style="color: #7B7F8B">/*</span></span>
<span class="line"><span style="color: #7B7F8B">Outputs:</span></span>
<span class="line"><span style="color: #7B7F8B">Apples Bananas Cherries</span></span>
<span class="line"><span style="color: #7B7F8B">*/</span></span></code></pre></div>



<p>Template Literals have the added benefit of allowing string interpolation in JavaScript. You can read more on that further down the article.</p>



<p>Template Literals are <a href="https://caniuse.com/template-literals" target="_blank" rel="noopener">supported in all modern browsers</a>. Unless you need to support Internet Explorer (my heart is with you), you should look no further.</p>



<p>So, next time you&#8217;re coding, remember to use template literals. Not only will they make your code cleaner, but they&#8217;ll also reduce the time you spend debugging. Plus, they&#8217;re a modern feature of JavaScript worth incorporating into your toolkit.</p>



<h3 class="wp-block-heading">2. Use Newline Escaping</h3>



<p>Often, you&#8217;ll use newline escaping to create multiline strings in JavaScript, as it&#8217;s a commonly employed technique. Understanding this method is crucial for creating javascript multiline strings.</p>



<p>Here&#8217;s how it works: you end a line with a backslash (<code>\</code>), and JavaScript interprets the following line as a continuation of the current string.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="const multiLineString = &quot;Apples \
Bananas \
Cherries&quot;;

console.log(multiLineString);
/*
Outputs:
Apples Bananas Cherries
*/" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">const</span><span style="color: #F6F6F4"> multiLineString </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Apples </span><span style="color: #F286C4">\</span></span>
<span class="line"><span style="color: #E7EE98">Bananas </span><span style="color: #F286C4">\</span></span>
<span class="line"><span style="color: #E7EE98">Cherries</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">console.</span><span style="color: #62E884">log</span><span style="color: #F6F6F4">(multiLineString);</span></span>
<span class="line"><span style="color: #7B7F8B">/*</span></span>
<span class="line"><span style="color: #7B7F8B">Outputs:</span></span>
<span class="line"><span style="color: #7B7F8B">Apples Bananas Cherries</span></span>
<span class="line"><span style="color: #7B7F8B">*/</span></span></code></pre></div>



<p>This use of newline escaping can be convenient when dealing with large chunks of text or when you&#8217;re looking to maintain the readability of your code. However, note that each newline and indentation will be part of your final string, which might not always be desired.</p>



<p>If you want to include new lines in your output text with this approach, you must explicitly add the new line character to your code.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="const multiLineString = &quot;Apples\n\
Bananas\n\
Cherries&quot;;

console.log(multiLineString);
/*
Outputs:
Apples
Bananas
Cherries
*/" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">const</span><span style="color: #F6F6F4"> multiLineString </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Apples</span><span style="color: #F286C4">\n\</span></span>
<span class="line"><span style="color: #E7EE98">Bananas</span><span style="color: #F286C4">\n\</span></span>
<span class="line"><span style="color: #E7EE98">Cherries</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">console.</span><span style="color: #62E884">log</span><span style="color: #F6F6F4">(multiLineString);</span></span>
<span class="line"><span style="color: #7B7F8B">/*</span></span>
<span class="line"><span style="color: #7B7F8B">Outputs:</span></span>
<span class="line"><span style="color: #7B7F8B">Apples</span></span>
<span class="line"><span style="color: #7B7F8B">Bananas</span></span>
<span class="line"><span style="color: #7B7F8B">Cherries</span></span>
<span class="line"><span style="color: #7B7F8B">*/</span></span></code></pre></div>



<p>Overall, mastering newline escaping is a vital skill for effectively creating multiline strings in JavaScript.</p>



<h3 class="wp-block-heading">3. Use String Concatenation</h3>



<p>How can string concatenation help in creating multiline strings in JavaScript?</p>



<p>It&#8217;s simple. JavaScript lets you concatenate or combine strings using the &#8220;+&#8221; operator. You can use this to create a multiline string. Start with a string, optionally add a newline character, and add another string. Repeat this as many times as you need.</p>



<p>Here&#8217;s an example:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="const multiLineString = &quot;Apples &quot; +
  &quot;Bananas &quot; +
  &quot;Cherries&quot;;

console.log(multiLineString);
/*
Outputs:
Apples Bananas Cherries
*/" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">const</span><span style="color: #F6F6F4"> multiLineString </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Apples </span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">+</span></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Bananas </span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">+</span></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Cherries</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">console.</span><span style="color: #62E884">log</span><span style="color: #F6F6F4">(multiLineString);</span></span>
<span class="line"><span style="color: #7B7F8B">/*</span></span>
<span class="line"><span style="color: #7B7F8B">Outputs:</span></span>
<span class="line"><span style="color: #7B7F8B">Apples Bananas Cherries</span></span>
<span class="line"><span style="color: #7B7F8B">*/</span></span></code></pre></div>



<p>If you prefer to output a multi-line string, you can do that too:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="const multiLineString = &quot;Apples\n&quot; +
  &quot;Bananas\n&quot; +
  &quot;Cherries&quot;;

console.log(multiLineString);
/*
Outputs:
Apples
Bananas
Cherries
*/" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">const</span><span style="color: #F6F6F4"> multiLineString </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Apples</span><span style="color: #F286C4">\n</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">+</span></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Bananas</span><span style="color: #F286C4">\n</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">+</span></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Cherries</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">console.</span><span style="color: #62E884">log</span><span style="color: #F6F6F4">(multiLineString);</span></span>
<span class="line"><span style="color: #7B7F8B">/*</span></span>
<span class="line"><span style="color: #7B7F8B">Outputs:</span></span>
<span class="line"><span style="color: #7B7F8B">Apples</span></span>
<span class="line"><span style="color: #7B7F8B">Bananas</span></span>
<span class="line"><span style="color: #7B7F8B">Cherries</span></span>
<span class="line"><span style="color: #7B7F8B">*/</span></span></code></pre></div>



<p>And that&#8217;s how you can use string concatenation to make multiline strings in JavaScript!</p>



<h3 class="wp-block-heading">4. Use Array Joining</h3>



<p>You&#8217;re now ready to explore array joining, another practical method for creating multiline strings in JavaScript. You&#8217;ll find it&#8217;s a cleaner, more efficient way to create multiline strings than string concatenation.</p>



<p>First, you&#8217;ll need an array. Populate it with the lines of your multiline string. When you&#8217;ve got your array set up, you&#8217;ll use array joining to merge the elements into a single string. Call the join method on your array, and provide the newline character as the argument. This tells JavaScript to add a new line between each array element when joining them together.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="const lines = [&quot;Apples&quot;,
  &quot;Bananas&quot;,
  &quot;Cherries&quot;];

const multiLineString = lines.join(&quot;\n&quot;);

console.log(multiLineString);
/*
Outputs:
Apples
Bananas
Cherries
*/" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">const</span><span style="color: #F6F6F4"> lines </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> [</span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Apples</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">,</span></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Bananas</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">,</span></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">Cherries</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">];</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">const</span><span style="color: #F6F6F4"> multiLineString </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> lines.</span><span style="color: #62E884">join</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&quot;</span><span style="color: #F286C4">\n</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">console.</span><span style="color: #62E884">log</span><span style="color: #F6F6F4">(multiLineString);</span></span>
<span class="line"><span style="color: #7B7F8B">/*</span></span>
<span class="line"><span style="color: #7B7F8B">Outputs:</span></span>
<span class="line"><span style="color: #7B7F8B">Apples</span></span>
<span class="line"><span style="color: #7B7F8B">Bananas</span></span>
<span class="line"><span style="color: #7B7F8B">Cherries</span></span>
<span class="line"><span style="color: #7B7F8B">*/</span></span></code></pre></div>



<p>Voila! With array joining, you&#8217;ve created a clean, well-documented multiline string. Try it and discover how array joining can streamline your JavaScript coding.</p>



<h2 class="wp-block-heading">Key Considerations For Successfully Working with JavaScript Multiline Strings</h2>



<p>When dealing with JavaScript multiline strings, it&#8217;s crucial to understand the role of backtick operators and escape sequences in ensuring correct code execution.</p>



<p>Backtick operators (` `) allow easier formatting, including creating multiline strings without escape sequences. However, escape sequences like <code>\n</code> are still valuable for controlling special characters within your strings.</p>



<p>Remember that backticks and escape sequences are your friends for successfully working with JavaScript multiline strings &#8211; use them wisely.</p>



<p>Always test your code to ensure it&#8217;s running as expected. With practice, you&#8217;ll master these techniques and write efficient, clean, and well-documented code.</p>



<h2 class="wp-block-heading">What are Strings in JavaScript?</h2>



<p>In JavaScript, strings are sequences of characters used to represent text. They can be created using single quotes, double quotes, or backticks.</p>



<p>Each method has its use cases and quirks, which we&#8217;ll discuss next.</p>



<h3 class="wp-block-heading">Single Quote Strings</h3>



<p>Single quote strings are no different from double quote strings, except for the delimiter used. You can use single-quote strings and double-quote ones interchangeably. However, it&#8217;s better to maintain consistency within the same code base.</p>



<p>Single quote strings allow you to use double quotes within the string without escaping.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="const str = 'My &quot;quoted&quot; string!'

console.log(str);
/*
Outputs:
My &quot;quoted&quot; string!
*/" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">const</span><span style="color: #F6F6F4"> str </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">My &quot;quoted&quot; string!</span><span style="color: #DEE492">&#39;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">console.</span><span style="color: #62E884">log</span><span style="color: #F6F6F4">(str);</span></span>
<span class="line"><span style="color: #7B7F8B">/*</span></span>
<span class="line"><span style="color: #7B7F8B">Outputs:</span></span>
<span class="line"><span style="color: #7B7F8B">My &quot;quoted&quot; string!</span></span>
<span class="line"><span style="color: #7B7F8B">*/</span></span></code></pre></div>



<p>You can use single quotes to create multiline strings. Start and end your string with a single quote, then use a backslash at the end of each line. It&#8217;s a handy trick, especially when dealing with longer text blocks.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="const multiLineString = 'Apples \
Bananas \
Cherries';

console.log(multiLineString);
/*
Outputs:
Apples Bananas Cherries
*/" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">const</span><span style="color: #F6F6F4"> multiLineString </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">Apples </span><span style="color: #F286C4">\</span></span>
<span class="line"><span style="color: #E7EE98">Bananas </span><span style="color: #F286C4">\</span></span>
<span class="line"><span style="color: #E7EE98">Cherries</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">console.</span><span style="color: #62E884">log</span><span style="color: #F6F6F4">(multiLineString);</span></span>
<span class="line"><span style="color: #7B7F8B">/*</span></span>
<span class="line"><span style="color: #7B7F8B">Outputs:</span></span>
<span class="line"><span style="color: #7B7F8B">Apples Bananas Cherries</span></span>
<span class="line"><span style="color: #7B7F8B">*/</span></span></code></pre></div>



<p>Remember, though, that JavaScript doesn&#8217;t automatically insert a space or newline character at the end of each line. You&#8217;ll need to add those yourself.</p>



<h3 class="wp-block-heading">Double Quote Strings</h3>



<p>You&#8217;ve already learned that Single quote strings are no different from double quote strings, except for the delimiter used.</p>



<p>The only difference is that double quote strings allow you to use single quotes within the string without escaping.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="const str = &quot;My 'quoted' string!&quot;

console.log(str);
/*
Outputs:
My 'quoted' string!
*/" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">const</span><span style="color: #F6F6F4"> str </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">My &#39;quoted&#39; string!</span><span style="color: #DEE492">&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">console.</span><span style="color: #62E884">log</span><span style="color: #F6F6F4">(str);</span></span>
<span class="line"><span style="color: #7B7F8B">/*</span></span>
<span class="line"><span style="color: #7B7F8B">Outputs:</span></span>
<span class="line"><span style="color: #7B7F8B">My &#39;quoted&#39; string!</span></span>
<span class="line"><span style="color: #7B7F8B">*/</span></span></code></pre></div>



<h3 class="wp-block-heading">Backticks</h3>



<p>Backticks allow multiline strings and enable variables and expressions embedded in a process known as <a href="https://en.wikipedia.org/wiki/String_interpolation" target="_blank" rel="noopener">String Interpolation</a>.</p>



<p>Backticks, denoted by (` `), are vital when creating multi-line strings. This isn&#8217;t just about getting your code to look pretty. It&#8217;s about crafting efficient, clean, and well-documented JavaScript multiline strings.</p>



<p>Here&#8217;s the magic: backticks introduce template literals, a new form of output variable values. You can embed expressions within your string rather than breaking your strings and concatenating variables.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="const item1 = &quot;apples&quot;;
const item2 = &quot;bananas&quot;;
const item3 = &quot;cherries&quot;;

const interpolatedString = `I love ${item1}, ${item2} and ${item3}.`;

console.log(interpolatedString);
/*
Outputs:
I love apples, bananas and cherries.
*/" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">const</span><span style="color: #F6F6F4"> item1 </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">apples</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">;</span></span>
<span class="line"><span style="color: #F286C4">const</span><span style="color: #F6F6F4"> item2 </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">bananas</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">;</span></span>
<span class="line"><span style="color: #F286C4">const</span><span style="color: #F6F6F4"> item3 </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">cherries</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">const</span><span style="color: #F6F6F4"> interpolatedString </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #E7EE98">`I love </span><span style="color: #F286C4">${</span><span style="color: #F6F6F4">item1</span><span style="color: #F286C4">}</span><span style="color: #E7EE98">, </span><span style="color: #F286C4">${</span><span style="color: #F6F6F4">item2</span><span style="color: #F286C4">}</span><span style="color: #E7EE98"> and </span><span style="color: #F286C4">${</span><span style="color: #F6F6F4">item3</span><span style="color: #F286C4">}</span><span style="color: #E7EE98">.`</span><span style="color: #F6F6F4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">console.</span><span style="color: #62E884">log</span><span style="color: #F6F6F4">(interpolatedString);</span></span>
<span class="line"><span style="color: #7B7F8B">/*</span></span>
<span class="line"><span style="color: #7B7F8B">Outputs:</span></span>
<span class="line"><span style="color: #7B7F8B">I love apples, bananas and cherries.</span></span>
<span class="line"><span style="color: #7B7F8B">*/</span></span></code></pre></div>



<p>You can also combine string interpolation with multiline outputs.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="const item1 = &quot;apples&quot;;
const item2 = &quot;bananas&quot;;
const item3 = &quot;cherries&quot;;

const interpolatedString = `I love ${item1}, ${item2} and ${item3}.
They are delicious!`;

console.log(interpolatedString);
/*
Outputs:
I love apples, bananas and cherries.
They are delicious!
*/" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">const</span><span style="color: #F6F6F4"> item1 </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">apples</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">;</span></span>
<span class="line"><span style="color: #F286C4">const</span><span style="color: #F6F6F4"> item2 </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">bananas</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">;</span></span>
<span class="line"><span style="color: #F286C4">const</span><span style="color: #F6F6F4"> item3 </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">cherries</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">const</span><span style="color: #F6F6F4"> interpolatedString </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #E7EE98">`I love </span><span style="color: #F286C4">${</span><span style="color: #F6F6F4">item1</span><span style="color: #F286C4">}</span><span style="color: #E7EE98">, </span><span style="color: #F286C4">${</span><span style="color: #F6F6F4">item2</span><span style="color: #F286C4">}</span><span style="color: #E7EE98"> and </span><span style="color: #F286C4">${</span><span style="color: #F6F6F4">item3</span><span style="color: #F286C4">}</span><span style="color: #E7EE98">.</span></span>
<span class="line"><span style="color: #E7EE98">They are delicious!`</span><span style="color: #F6F6F4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">console.</span><span style="color: #62E884">log</span><span style="color: #F6F6F4">(interpolatedString);</span></span>
<span class="line"><span style="color: #7B7F8B">/*</span></span>
<span class="line"><span style="color: #7B7F8B">Outputs:</span></span>
<span class="line"><span style="color: #7B7F8B">I love apples, bananas and cherries.</span></span>
<span class="line"><span style="color: #7B7F8B">They are delicious!</span></span>
<span class="line"><span style="color: #7B7F8B">*/</span></span></code></pre></div>



<p>You&#8217;ll find that using backticks is a cleaner, more efficient method.</p>



<h2 class="wp-block-heading">How to Create Multiline Strings in TypeScript?</h2>



<p>Creating multiline strings in TypeScript is no different than creating them in JavaScript. TypeScript is a superset of JavaScript; as such, all valid JavaScript code is also valid TypeScript code as well.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="const item1: string = &quot;apples&quot;;
const item2: string = &quot;bananas&quot;;
const item3: string = &quot;cherries&quot;;

const interpolatedString: string = `I love ${item1}, ${item2} and ${item3}.
They are delicious!`;

console.log(interpolatedString);
/*
Outputs:
I love apples, bananas and cherries.
They are delicious!
*/" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">const</span><span style="color: #F6F6F4"> item1</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">string</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">apples</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">;</span></span>
<span class="line"><span style="color: #F286C4">const</span><span style="color: #F6F6F4"> item2</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">string</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">bananas</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">;</span></span>
<span class="line"><span style="color: #F286C4">const</span><span style="color: #F6F6F4"> item3</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">string</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">cherries</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">const</span><span style="color: #F6F6F4"> interpolatedString</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">string</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #E7EE98">`I love </span><span style="color: #F286C4">${</span><span style="color: #F6F6F4">item1</span><span style="color: #F286C4">}</span><span style="color: #E7EE98">, </span><span style="color: #F286C4">${</span><span style="color: #F6F6F4">item2</span><span style="color: #F286C4">}</span><span style="color: #E7EE98"> and </span><span style="color: #F286C4">${</span><span style="color: #F6F6F4">item3</span><span style="color: #F286C4">}</span><span style="color: #E7EE98">.</span></span>
<span class="line"><span style="color: #E7EE98">They are delicious!`</span><span style="color: #F6F6F4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">console.</span><span style="color: #62E884">log</span><span style="color: #F6F6F4">(interpolatedString);</span></span>
<span class="line"><span style="color: #7B7F8B">/*</span></span>
<span class="line"><span style="color: #7B7F8B">Outputs:</span></span>
<span class="line"><span style="color: #7B7F8B">I love apples, bananas and cherries.</span></span>
<span class="line"><span style="color: #7B7F8B">They are delicious!</span></span>
<span class="line"><span style="color: #7B7F8B">*/</span></span></code></pre></div>



<p>There is no TypeScript-specific way to create multiline strings. </p>



<h2 class="wp-block-heading">Frequently Asked Questions</h2>



<h3 class="wp-block-heading">How Can I Convert Javascript Multiline Strings to Single Line Strings?</h3>



<p>To convert a multiline string to a single line string in JavaScript, you can use the <code>replace()</code> method with a regular expression to replace all newline characters (<code>\n</code>) and carriage return characters (<code>\r</code>) with an empty string or a space. Here’s how you can do it:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="let multiLineString = `Apples
Bananas
Cherries`;

let singleLineString = multiLineString.replace(/\r?\n|\r/g, ' ');

console.log(singleLineString);
/*
Outputs:
Apples Bananas Cherries
*/" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">let</span><span style="color: #F6F6F4"> multiLineString </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #E7EE98">`Apples</span></span>
<span class="line"><span style="color: #E7EE98">Bananas</span></span>
<span class="line"><span style="color: #E7EE98">Cherries`</span><span style="color: #F6F6F4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">let</span><span style="color: #F6F6F4"> singleLineString </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> multiLineString.</span><span style="color: #62E884">replace</span><span style="color: #F6F6F4">(</span><span style="color: #EE6666">/</span><span style="color: #BF9EEE">\r</span><span style="color: #F286C4">?</span><span style="color: #BF9EEE">\n</span><span style="color: #F286C4">|</span><span style="color: #BF9EEE">\r</span><span style="color: #EE6666">/</span><span style="color: #F286C4">g</span><span style="color: #F6F6F4">, </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98"> </span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">console.</span><span style="color: #62E884">log</span><span style="color: #F6F6F4">(singleLineString);</span></span>
<span class="line"><span style="color: #7B7F8B">/*</span></span>
<span class="line"><span style="color: #7B7F8B">Outputs:</span></span>
<span class="line"><span style="color: #7B7F8B">Apples Bananas Cherries</span></span>
<span class="line"><span style="color: #7B7F8B">*/</span></span></code></pre></div>



<h3 class="wp-block-heading">Can Javascript Multiline Strings Be Used With Arrays?</h3>



<p>Yes, you can use multiline strings with arrays in JavaScript. You&#8217;d define your array and include the multiline strings as elements. Remember, they&#8217;re just strings, broken over several lines for readability.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="let fruits = ['Apples', 'Bananas', 'Cherries'];

let multiLineString = fruits.join('\n');

console.log(multiLineString); 
/*
Outputs:
Apples
Bananas
Cherries
*/" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">let</span><span style="color: #F6F6F4"> fruits </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> [</span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">Apples</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">, </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">Bananas</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">, </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">Cherries</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">];</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">let</span><span style="color: #F6F6F4"> multiLineString </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> fruits.</span><span style="color: #62E884">join</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&#39;</span><span style="color: #F286C4">\n</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">console.</span><span style="color: #62E884">log</span><span style="color: #F6F6F4">(multiLineString); </span></span>
<span class="line"><span style="color: #7B7F8B">/*</span></span>
<span class="line"><span style="color: #7B7F8B">Outputs:</span></span>
<span class="line"><span style="color: #7B7F8B">Apples</span></span>
<span class="line"><span style="color: #7B7F8B">Bananas</span></span>
<span class="line"><span style="color: #7B7F8B">Cherries</span></span>
<span class="line"><span style="color: #7B7F8B">*/</span></span></code></pre></div>



<h3 class="wp-block-heading">What&#8217;s the Difference Between Multiline Strings in Javascript and Python?</h3>



<p>In JavaScript, you use backticks to create multiline strings, while in Python, you utilize triple quotes. It&#8217;s like comparing apples to oranges; each has its unique way of breaking lines in a string.</p>



<h3 class="wp-block-heading">Can You Use Javascript Multiline Strings in JSON Objects?</h3>



<p>No, you can&#8217;t use JavaScript multiline strings in JSON objects. JSON strictly follows a specific syntax, and multiline strings aren&#8217;t part of it. You&#8217;ll need to handle strings differently when working with JSON.</p>



<h2 class="wp-block-heading">Conclusion</h2>



<p>In conclusion, mastering JavaScript multiline strings is like learning to ride a penny-farthing in a world of mountain bikes. It&#8217;s an old-school skill, but it still holds its charm.</p>



<p>Remember, the key to nailing it is understanding its constraints and leveraging its potential. With patience and practice, you&#8217;ll be able to weave intricate lines of code quickly.</p>



<p>This is your stepping stone to becoming a proficient coder. Keep coding, and keep exploring!</p>
<p>The post <a rel="nofollow" href="https://eranstiller.com/javascript-multiline-strings">Top 4 Ways to Create JavaScript Multiline Strings</a> appeared first on <a rel="nofollow" href="https://eranstiller.com">Eran Stiller</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://eranstiller.com/javascript-multiline-strings/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>13 Best Software Engineering Books To Read In 2023</title>
		<link>https://eranstiller.com/software-engineering-books</link>
					<comments>https://eranstiller.com/software-engineering-books#respond</comments>
		
		<dc:creator><![CDATA[Eran Stiller]]></dc:creator>
		<pubDate>Mon, 11 Sep 2023 13:57:03 +0000</pubDate>
				<category><![CDATA[Software Development]]></category>
		<guid isPermaLink="false">https://eranstiller.com/?p=3639</guid>

					<description><![CDATA[<p>Are you a software engineer looking to enhance your expertise through insightful literature? Are you looking to skyrocket your skills and stand out from the crowd? As software engineers, we always strive to keep our heads above the water and learn the latest tech stack. But what if I told you that returning to the...</p>
<p>The post <a rel="nofollow" href="https://eranstiller.com/software-engineering-books">13 Best Software Engineering Books To Read In 2023</a> appeared first on <a rel="nofollow" href="https://eranstiller.com">Eran Stiller</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Are you a software engineer looking to enhance your expertise through insightful literature? Are you looking to <a href="https://eranstiller.com/software-engineer-skills" data-type="post" data-id="3582">skyrocket your skills and stand out from the crowd</a>?</p>



<p>As software engineers, we always strive to keep our heads above the water and learn the latest tech stack. But what if I told you that returning to the basics could be your best bet to upgrade your software development career?</p>



<p>Whether you are just beginning your journey or are a seasoned professional, understanding the core principles detailed in these books can aid in honing your skills and advancing your career. These handpicked software engineering books guide you in making informed design choices, understanding complex&nbsp;codes, and navigating enterprise-level application development.</p>



<p>Dive in and take charge of your learning journey to stay ahead in the competitive software engineering world.</p>


<div class="kb-row-layout-wrap kb-row-layout-id3639_ad1480-9f alignnone wp-block-kadence-rowlayout"><div class="kt-row-column-wrap kt-has-1-columns kt-row-layout-equal kt-tab-layout-inherit kt-mobile-layout-row kt-row-valign-top">

<div class="wp-block-kadence-column kadence-column3639_13e725-96 inner-column-1"><div class="kt-inside-inner-col">
<h2 class="wp-block-heading">Key Takeaways</h2>



<ul class="wp-block-list">
<li>The recommended software engineering books include &#8220;Design Patterns: Elements of Reusable Object-Oriented Software,&#8221; &#8220;The Pragmatic Programmer: Your Journey to Mastery,&#8221; &#8220;Domain-Driven Design: Tackling Complexity in the Heart of Software,&#8221; &#8220;Patterns of Enterprise Application Architecture,&#8221; and &#8220;Refactoring: Improving the Design of Existing Code.&#8221;</li>



<li>Software engineers need a strong foundation in computer science fundamentals, such as binary code, logic gates, and higher-level programming languages.</li>



<li>Software development and construction go beyond coding. Focusing on design choices, coding style, algorithms, performance, debugging, preventing common mistakes, improving code efficiency, and practical software maintenance is essential.</li>
</ul>
</div></div>

</div></div>




<h2 class="wp-block-heading" id="what-are-the-best-software-engineering-books">What Are the Best Software Engineering Books?</h2>



<p>This list of the best books rounds up the pivotal texts every software engineer should read, highlighting foundational computer science concepts,&nbsp;code refactoring strategies, and tackling complexity in software systems.</p>



<p>From the classic &#8220;Design Patterns: Elements of Reusable Object-Oriented Software,&#8221; which offers a versatile toolkit for object-oriented software development, to &#8220;The Pragmatic Programmer: Your Journey to Mastery&#8221; that guides you in honing your craft, there&#8217;s a wealth of knowledge to explore.</p>



<p>You&#8217;ll also delve into &#8220;Domain-Driven Design: Tackling Complexity in the Heart of Software&#8221; to learn how to manage complexities in software systems, &#8220;Patterns of Enterprise Application Architecture&#8221; for a deep understanding of enterprise-level application development, and finally, &#8220;Refactoring: Improving the Design of Existing Code&#8221; to grasp the art and science of improving your existing codebase.</p>



<h3 class="wp-block-heading" id="design-patterns-elements-of-reusable-object-oriented-software">1. Design Patterns: Elements of Reusable Object-Oriented Software</h3>


<div class="kb-row-layout-wrap kb-row-layout-id3639_4e96c3-18 alignnone wp-block-kadence-rowlayout"><div class="kt-row-column-wrap kt-has-1-columns kt-row-layout-equal kt-tab-layout-inherit kt-mobile-layout-row kt-row-valign-top">

<div class="wp-block-kadence-column kadence-column3639_c5372b-21 kb-section-dir-vertical inner-column-1"><div class="kt-inside-inner-col"><div class="kb-row-layout-wrap kb-row-layout-id3639_077bce-5a alignnone wp-block-kadence-rowlayout"><div class="kt-row-column-wrap kt-has-2-columns kt-row-layout-right-golden kt-tab-layout-inherit kt-mobile-layout-row kt-row-valign-top">

<div class="wp-block-kadence-column kadence-column3639_fb548b-ea kb-section-dir-vertical inner-column-1"><div class="kt-inside-inner-col">
<div class="wp-block-kadence-image kb-image3639_2fa0a7-73"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="814" height="1024" src="https://eranstiller.com/wp-content/uploads/2023/09/Design-Patterns-Elements-of-Reusable-Object-Oriented-Software-Cover-814x1024.jpg" alt="Book cover of &quot;Design Patterns: Elements of Reusable Object-Oriented Software&quot;" class="kb-img wp-image-3651" srcset="https://eranstiller.com/wp-content/uploads/2023/09/Design-Patterns-Elements-of-Reusable-Object-Oriented-Software-Cover-814x1024.jpg 814w, https://eranstiller.com/wp-content/uploads/2023/09/Design-Patterns-Elements-of-Reusable-Object-Oriented-Software-Cover-238x300.jpg 238w, https://eranstiller.com/wp-content/uploads/2023/09/Design-Patterns-Elements-of-Reusable-Object-Oriented-Software-Cover-768x966.jpg 768w, https://eranstiller.com/wp-content/uploads/2023/09/Design-Patterns-Elements-of-Reusable-Object-Oriented-Software-Cover-1221x1536.jpg 1221w, https://eranstiller.com/wp-content/uploads/2023/09/Design-Patterns-Elements-of-Reusable-Object-Oriented-Software-Cover.jpg 1352w" sizes="auto, (max-width: 814px) 100vw, 814px" /></figure></div>
</div></div>



<div class="wp-block-kadence-column kadence-column3639_e4cbf5-ad inner-column-2"><div class="kt-inside-inner-col">
<p><strong>Authors</strong>: Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides<br><strong>Publisher</strong>: Addison-Wesley<br><strong>Latest Edition</strong>: 1st edition<br><strong>Publication Year</strong>: 1994<br><strong>Number of Pages</strong>: 416<br><strong>Target Audience</strong>: Experienced software developers, software architects, and students learning about software design.</p>



<div class="wp-block-kadence-advancedbtn kb-buttons-wrap kb-btns3639_2f8a16-66"><a class="kb-button kt-button button kb-btn3639_8ba19d-76 kt-btn-size-standard kt-btn-width-type-full kb-btn-global-outline  kt-btn-has-text-true kt-btn-has-svg-true  wp-block-kadence-singlebtn" href="https://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612" target="_blank" rel="noopener"><span class="kt-btn-inner-text">Check Price on Amazon</span><span class="kb-svg-icon-wrap kb-svg-icon-fas_arrow-right kt-btn-icon-side-right"><svg viewBox="0 0 448 512"  fill="currentColor" xmlns="http://www.w3.org/2000/svg"  aria-hidden="true"><path d="M190.5 66.9l22.2-22.2c9.4-9.4 24.6-9.4 33.9 0L441 239c9.4 9.4 9.4 24.6 0 33.9L246.6 467.3c-9.4 9.4-24.6 9.4-33.9 0l-22.2-22.2c-9.5-9.5-9.3-25 .4-34.3L311.4 296H24c-13.3 0-24-10.7-24-24v-32c0-13.3 10.7-24 24-24h287.4L190.9 101.2c-9.8-9.3-10-24.8-.4-34.3z"/></svg></span></a></div>
</div></div>

</div></div></div></div>

</div></div>


<p>It&#8217;s a classic in the field and still very much relevant today. &#8220;Design Patterns: Elements of Reusable Object-Oriented Software&#8221; is one of those books&nbsp;every software engineer and developer should read. It&#8217;s packed with practical examples that leverage your knowledge and push you to explore new concepts. The authors, known as the Gang of Four, present 23&nbsp;design patterns to help you create more flexible, elegant, and reusable designs.</p>



<p>You&#8217;ll find the book&#8217;s real-world applications invaluable. You&#8217;ll comprehend how each pattern works in object-oriented design and see how they can be combined for optimum efficiency. You&#8217;ll also learn to recognize situations where applying a design pattern could save time and improve overall code quality.</p>



<h4 class="wp-block-heading">Key Benefits</h4>



<ul class="wp-block-list">
<li>Enhances code readability and reusability</li>



<li>Improves problem-solving skills</li>



<li>Boosts understanding of object-oriented design</li>
</ul>



<h4 class="wp-block-heading">Pros</h4>



<ul class="wp-block-list">
<li>Detailed examples and diagrams</li>



<li>Easy to comprehend language</li>



<li>Widely applicable across many programming languages</li>
</ul>



<h4 class="wp-block-heading">Cons</h4>



<ul class="wp-block-list">
<li>Some examples are dated</li>



<li>Requires prior object-oriented programming knowledge</li>
</ul>



<div class="wp-block-kadence-advancedbtn kb-buttons-wrap kb-btns3639_d56b7a-70"><a class="kb-button kt-button button kb-btn3639_2d13ef-12 kt-btn-size-standard kt-btn-width-type-full kb-btn-global-outline  kt-btn-has-text-true kt-btn-has-svg-true  wp-block-kadence-singlebtn" href="https://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612" target="_blank" rel="noopener"><span class="kt-btn-inner-text">Check Price on Amazon</span><span class="kb-svg-icon-wrap kb-svg-icon-fas_arrow-right kt-btn-icon-side-right"><svg viewBox="0 0 448 512"  fill="currentColor" xmlns="http://www.w3.org/2000/svg"  aria-hidden="true"><path d="M190.5 66.9l22.2-22.2c9.4-9.4 24.6-9.4 33.9 0L441 239c9.4 9.4 9.4 24.6 0 33.9L246.6 467.3c-9.4 9.4-24.6 9.4-33.9 0l-22.2-22.2c-9.5-9.5-9.3-25 .4-34.3L311.4 296H24c-13.3 0-24-10.7-24-24v-32c0-13.3 10.7-24 24-24h287.4L190.9 101.2c-9.8-9.3-10-24.8-.4-34.3z"/></svg></span></a></div>



<h3 class="wp-block-heading" id="domain-driven-design-tackling-complexity-in-the-heart-of-software">2. Domain-Driven Design: Tackling Complexity in the Heart of Software</h3>


<div class="kb-row-layout-wrap kb-row-layout-id3639_0da1bf-cc alignnone wp-block-kadence-rowlayout"><div class="kt-row-column-wrap kt-has-1-columns kt-row-layout-equal kt-tab-layout-inherit kt-mobile-layout-row kt-row-valign-top">

<div class="wp-block-kadence-column kadence-column3639_832990-7e kb-section-dir-vertical inner-column-1"><div class="kt-inside-inner-col"><div class="kb-row-layout-wrap kb-row-layout-id3639_a13a67-7d alignnone wp-block-kadence-rowlayout"><div class="kt-row-column-wrap kt-has-2-columns kt-row-layout-right-golden kt-tab-layout-inherit kt-mobile-layout-row kt-row-valign-top">

<div class="wp-block-kadence-column kadence-column3639_a3b02a-76 kb-section-dir-vertical inner-column-1"><div class="kt-inside-inner-col">
<div class="wp-block-kadence-image kb-image3639_6dcadc-47"><figure class="aligncenter"><img loading="lazy" decoding="async" width="378" height="500" src="https://eranstiller.com/wp-content/uploads/2023/09/Domain-Driven-Design-Tackling-Complexity-in-the-Heart-of-Software-Cover.jpg" alt="The book cover of &quot;Domain-Driven Design: Tackling Complexity in the Heart of Software&quot;" class="kb-img wp-image-3656" srcset="https://eranstiller.com/wp-content/uploads/2023/09/Domain-Driven-Design-Tackling-Complexity-in-the-Heart-of-Software-Cover.jpg 378w, https://eranstiller.com/wp-content/uploads/2023/09/Domain-Driven-Design-Tackling-Complexity-in-the-Heart-of-Software-Cover-227x300.jpg 227w" sizes="auto, (max-width: 378px) 100vw, 378px" /></figure></div>
</div></div>



<div class="wp-block-kadence-column kadence-column3639_f0478e-d9 inner-column-2"><div class="kt-inside-inner-col">
<p><strong>Author</strong>: Eric Evans<br><strong>Publisher</strong>: Addison-Wesley<br><strong>Latest Edition</strong>: 1st edition<br><strong>Publication Year</strong>: 2003<br><strong>Number of Pages</strong>: 560<br><strong>Target Audience</strong>: Software developers, architects, and designers focused on complex domain modeling.</p>



<div class="wp-block-kadence-advancedbtn kb-buttons-wrap kb-btns3639_30cda3-3a"><a class="kb-button kt-button button kb-btn3639_df9cb6-6f kt-btn-size-standard kt-btn-width-type-full kb-btn-global-outline  kt-btn-has-text-true kt-btn-has-svg-true  wp-block-kadence-singlebtn" href="https://www.amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215" target="_blank" rel="noopener"><span class="kt-btn-inner-text">Check Price on Amazon</span><span class="kb-svg-icon-wrap kb-svg-icon-fas_arrow-right kt-btn-icon-side-right"><svg viewBox="0 0 448 512"  fill="currentColor" xmlns="http://www.w3.org/2000/svg"  aria-hidden="true"><path d="M190.5 66.9l22.2-22.2c9.4-9.4 24.6-9.4 33.9 0L441 239c9.4 9.4 9.4 24.6 0 33.9L246.6 467.3c-9.4 9.4-24.6 9.4-33.9 0l-22.2-22.2c-9.5-9.5-9.3-25 .4-34.3L311.4 296H24c-13.3 0-24-10.7-24-24v-32c0-13.3 10.7-24 24-24h287.4L190.9 101.2c-9.8-9.3-10-24.8-.4-34.3z"/></svg></span></a></div>
</div></div>

</div></div></div></div>

</div></div>


<p>Switching your focus to &#8220;Domain-Driven Design: Tackling Complexity in the Heart of Software,&#8221; you&#8217;ll discover a revolutionary approach to managing project complexity and aligning teams around a shared understanding of the business domain. This guide breaks down technical jargon into digestible bits, making understanding and implementing domain-driven design in your projects more manageable.</p>



<p>Author Eric Evans doesn&#8217;t just tell you about domain-driven design; he shows you how to do it, using relatable examples from various fields. You&#8217;ll learn to model your domain, create rich, expressive domain models, and translate them into working software.</p>



<p>Read this book to delve into strategic design, which deals with large models and teams, and you&#8217;ll understand the patterns for integrating with other systems on your way to writing great software.</p>



<h4 class="wp-block-heading">Key Benefits</h4>



<ul class="wp-block-list">
<li>Understanding of domain-driven design principles</li>



<li>Ability to align teams and manage project complexity</li>



<li>Hands-on examples for practical knowledge</li>
</ul>



<h4 class="wp-block-heading">Pros</h4>



<ul class="wp-block-list">
<li>Clear and concise writing style</li>



<li>Comprehensive coverage of the topic</li>



<li>In-depth examples for better understanding</li>
</ul>



<h4 class="wp-block-heading">Cons</h4>



<ul class="wp-block-list">
<li>Requires some basic knowledge of software design</li>



<li>Might be slightly tricky for beginners</li>



<li>Some examples might seem abstract to a few readers</li>
</ul>



<div class="wp-block-kadence-advancedbtn kb-buttons-wrap kb-btns3639_6e5270-83"><a class="kb-button kt-button button kb-btn3639_da8877-51 kt-btn-size-standard kt-btn-width-type-full kb-btn-global-outline  kt-btn-has-text-true kt-btn-has-svg-true  wp-block-kadence-singlebtn" href="https://www.amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215" target="_blank" rel="noopener"><span class="kt-btn-inner-text">Check Price on Amazon</span><span class="kb-svg-icon-wrap kb-svg-icon-fas_arrow-right kt-btn-icon-side-right"><svg viewBox="0 0 448 512"  fill="currentColor" xmlns="http://www.w3.org/2000/svg"  aria-hidden="true"><path d="M190.5 66.9l22.2-22.2c9.4-9.4 24.6-9.4 33.9 0L441 239c9.4 9.4 9.4 24.6 0 33.9L246.6 467.3c-9.4 9.4-24.6 9.4-33.9 0l-22.2-22.2c-9.5-9.5-9.3-25 .4-34.3L311.4 296H24c-13.3 0-24-10.7-24-24v-32c0-13.3 10.7-24 24-24h287.4L190.9 101.2c-9.8-9.3-10-24.8-.4-34.3z"/></svg></span></a></div>



<h3 class="wp-block-heading" id="code-complete-a-practical-handbook-of-software-construction">3. Code Complete: A Practical Handbook of Software Construction</h3>


<div class="kb-row-layout-wrap kb-row-layout-id3639_18275f-2c alignnone wp-block-kadence-rowlayout"><div class="kt-row-column-wrap kt-has-1-columns kt-row-layout-equal kt-tab-layout-inherit kt-mobile-layout-row kt-row-valign-top">

<div class="wp-block-kadence-column kadence-column3639_19b2b7-8f"><div class="kt-inside-inner-col">
<div class="wp-block-kadence-column kadence-column3639_fe1363-64"><div class="kt-inside-inner-col">
<div class="wp-block-kadence-column kadence-column3639_4d4f22-7f kb-section-dir-vertical inner-column-1"><div class="kt-inside-inner-col"><div class="kb-row-layout-wrap kb-row-layout-id3639_ddaf08-ee alignnone wp-block-kadence-rowlayout"><div class="kt-row-column-wrap kt-has-2-columns kt-row-layout-right-golden kt-tab-layout-inherit kt-mobile-layout-row kt-row-valign-top">

<div class="wp-block-kadence-column kadence-column3639_407213-5f kb-section-dir-vertical inner-column-1"><div class="kt-inside-inner-col">
<div class="wp-block-kadence-image kb-image3639_4c8b8b-2b"><figure class="aligncenter"><img loading="lazy" decoding="async" width="1250" height="1522" src="https://eranstiller.com/wp-content/uploads/2023/09/Code-Complete-A-Practical-Handbook-of-Software-Construction-Cover.jpeg" alt="The book cover of &quot;Code Complete: A Practical Handbook of Software Construction&quot;" class="kb-img wp-image-3662" srcset="https://eranstiller.com/wp-content/uploads/2023/09/Code-Complete-A-Practical-Handbook-of-Software-Construction-Cover.jpeg 1250w, https://eranstiller.com/wp-content/uploads/2023/09/Code-Complete-A-Practical-Handbook-of-Software-Construction-Cover-246x300.jpeg 246w, https://eranstiller.com/wp-content/uploads/2023/09/Code-Complete-A-Practical-Handbook-of-Software-Construction-Cover-841x1024.jpeg 841w, https://eranstiller.com/wp-content/uploads/2023/09/Code-Complete-A-Practical-Handbook-of-Software-Construction-Cover-768x935.jpeg 768w" sizes="auto, (max-width: 1250px) 100vw, 1250px" /></figure></div>
</div></div>



<div class="wp-block-kadence-column kadence-column3639_619436-6d inner-column-2"><div class="kt-inside-inner-col">
<p><strong>Author</strong>: Steve McConnell<br><strong>Publisher</strong>: Microsoft Press<br><strong>Latest Edition</strong>: 2nd edition<br><strong>Publication Year</strong>: 2004<br><strong>Number of Pages</strong>: 960<br><strong>Target Audience</strong>: Software developers, both beginners and experienced, looking to enhance their code construction skills.</p>



<div class="wp-block-kadence-advancedbtn kb-buttons-wrap kb-btns3639_37f6ef-97"><a class="kb-button kt-button button kb-btn3639_3e9f05-96 kt-btn-size-standard kt-btn-width-type-full kb-btn-global-outline  kt-btn-has-text-true kt-btn-has-svg-true  wp-block-kadence-singlebtn" href="https://www.amazon.com/Code-Complete-Practical-Handbook-Construction/dp/0735619670" target="_blank" rel="noopener"><span class="kt-btn-inner-text">Check Price on Amazon</span><span class="kb-svg-icon-wrap kb-svg-icon-fas_arrow-right kt-btn-icon-side-right"><svg viewBox="0 0 448 512"  fill="currentColor" xmlns="http://www.w3.org/2000/svg"  aria-hidden="true"><path d="M190.5 66.9l22.2-22.2c9.4-9.4 24.6-9.4 33.9 0L441 239c9.4 9.4 9.4 24.6 0 33.9L246.6 467.3c-9.4 9.4-24.6 9.4-33.9 0l-22.2-22.2c-9.5-9.5-9.3-25 .4-34.3L311.4 296H24c-13.3 0-24-10.7-24-24v-32c0-13.3 10.7-24 24-24h287.4L190.9 101.2c-9.8-9.3-10-24.8-.4-34.3z"/></svg></span></a></div>
</div></div>

</div></div></div></div>
</div></div>
</div></div>

</div></div>


<p>&#8220;Code Complete: A Practical Handbook of Software Construction&#8221; by Steve McConnell is a must-read. This comprehensive guide offers an extensive understanding of software development.</p>



<p>It goes beyond coding and focuses on crafting quality software. The book emphasizes design choices, coding style, algorithms, performance, and debugging. It teaches you how to prevent common mistakes, improve code efficiency, and effectively maintain your software. It&#8217;s like a bible for professional software developers and a stepping stone for beginners.</p>



<h4 class="wp-block-heading">Key Benefits</h4>



<ul class="wp-block-list">
<li>Gain an in-depth understanding of software development</li>



<li>Learn tips and techniques to improve code quality</li>



<li>Acquire strategies for effective debugging and maintenance</li>
</ul>



<h4 class="wp-block-heading">Pros</h4>



<ul class="wp-block-list">
<li>Comprehensive and practical content</li>



<li>Covers a wide range of software construction topics</li>



<li>Useful for both beginners and experienced developers.</li>
</ul>



<h4 class="wp-block-heading">Cons</h4>



<ul class="wp-block-list">
<li>A hefty read, spanning over 900 pages</li>



<li>Some concepts may be outdated due to rapid technological changes</li>
</ul>



<div class="wp-block-kadence-advancedbtn kb-buttons-wrap kb-btns3639_d480aa-b2"><a class="kb-button kt-button button kb-btn3639_02565d-82 kt-btn-size-standard kt-btn-width-type-full kb-btn-global-outline  kt-btn-has-text-true kt-btn-has-svg-true  wp-block-kadence-singlebtn" href="https://www.amazon.com/Code-Complete-Practical-Handbook-Construction/dp/0735619670" target="_blank" rel="noopener"><span class="kt-btn-inner-text">Check Price on Amazon</span><span class="kb-svg-icon-wrap kb-svg-icon-fas_arrow-right kt-btn-icon-side-right"><svg viewBox="0 0 448 512"  fill="currentColor" xmlns="http://www.w3.org/2000/svg"  aria-hidden="true"><path d="M190.5 66.9l22.2-22.2c9.4-9.4 24.6-9.4 33.9 0L441 239c9.4 9.4 9.4 24.6 0 33.9L246.6 467.3c-9.4 9.4-24.6 9.4-33.9 0l-22.2-22.2c-9.5-9.5-9.3-25 .4-34.3L311.4 296H24c-13.3 0-24-10.7-24-24v-32c0-13.3 10.7-24 24-24h287.4L190.9 101.2c-9.8-9.3-10-24.8-.4-34.3z"/></svg></span></a></div>



<h3 class="wp-block-heading" id="clean-code-a-handbook-of-agile-software-craftsmanship">4. Clean Code: A Handbook of Agile Software Craftsmanship</h3>


<div class="kb-row-layout-wrap kb-row-layout-id3639_55de9a-70 alignnone wp-block-kadence-rowlayout"><div class="kt-row-column-wrap kt-has-1-columns kt-row-layout-equal kt-tab-layout-inherit kt-mobile-layout-row kt-row-valign-top">

<div class="wp-block-kadence-column kadence-column3639_c6948b-1d kb-section-dir-vertical inner-column-1"><div class="kt-inside-inner-col"><div class="kb-row-layout-wrap kb-row-layout-id3639_87e0f2-a5 alignnone wp-block-kadence-rowlayout"><div class="kt-row-column-wrap kt-has-2-columns kt-row-layout-right-golden kt-tab-layout-inherit kt-mobile-layout-row kt-row-valign-top">

<div class="wp-block-kadence-column kadence-column3639_86d361-a7 kb-section-dir-vertical inner-column-1"><div class="kt-inside-inner-col">
<div class="wp-block-kadence-image kb-image3639_57ddff-01"><figure class="aligncenter"><img loading="lazy" decoding="async" width="428" height="570" src="https://eranstiller.com/wp-content/uploads/2023/09/Clean-Code-A-Handbook-of-Agile-Software-Craftsmanship-Cover.jpeg" alt="Book cover of &quot;Clean Code: A Handbook of Agile Software Craftsmanship&quot;" class="kb-img wp-image-3665" srcset="https://eranstiller.com/wp-content/uploads/2023/09/Clean-Code-A-Handbook-of-Agile-Software-Craftsmanship-Cover.jpeg 428w, https://eranstiller.com/wp-content/uploads/2023/09/Clean-Code-A-Handbook-of-Agile-Software-Craftsmanship-Cover-225x300.jpeg 225w" sizes="auto, (max-width: 428px) 100vw, 428px" /></figure></div>
</div></div>



<div class="wp-block-kadence-column kadence-column3639_ae4901-e1 inner-column-2"><div class="kt-inside-inner-col">
<p><strong>Authors</strong>: Robert C. Martin<br><strong>Publisher</strong>: Prentice Hall<br><strong>Latest Edition</strong>: 1st edition<br><strong>Publication Year</strong>: 2008<br><strong>Number of Pages</strong>: 464<br><strong>Target Audience</strong>: Software developers interested in agile methodologies and writing cleaner, more maintainable code.</p>



<div class="wp-block-kadence-advancedbtn kb-buttons-wrap kb-btns3639_d9b735-05"><a class="kb-button kt-button button kb-btn3639_2a6e44-ec kt-btn-size-standard kt-btn-width-type-full kb-btn-global-outline  kt-btn-has-text-true kt-btn-has-svg-true  wp-block-kadence-singlebtn" href="https://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882" target="_blank" rel="noopener"><span class="kt-btn-inner-text">Check Price on Amazon</span><span class="kb-svg-icon-wrap kb-svg-icon-fas_arrow-right kt-btn-icon-side-right"><svg viewBox="0 0 448 512"  fill="currentColor" xmlns="http://www.w3.org/2000/svg"  aria-hidden="true"><path d="M190.5 66.9l22.2-22.2c9.4-9.4 24.6-9.4 33.9 0L441 239c9.4 9.4 9.4 24.6 0 33.9L246.6 467.3c-9.4 9.4-24.6 9.4-33.9 0l-22.2-22.2c-9.5-9.5-9.3-25 .4-34.3L311.4 296H24c-13.3 0-24-10.7-24-24v-32c0-13.3 10.7-24 24-24h287.4L190.9 101.2c-9.8-9.3-10-24.8-.4-34.3z"/></svg></span></a></div>
</div></div>

</div></div></div></div>

</div></div>


<p>Robert C. Martin&#8217;s &#8220;Clean Code: A Handbook of Agile Software Craftsmanship&#8221; is a masterpiece you shouldn&#8217;t miss. This book takes you on a journey, teaching you how to write clean code &#8211; code that is not just functional but also easy to read, understand, and modify. It&#8217;s filled with practical examples, demonstrating the transformation of a bad code into a good one.</p>



<p>Martin&#8217;s book emphasizes the importance of keeping your code clean and its impact on a team&#8217;s productivity. Mastering the principles in this book will elevate your&nbsp;coding skills to a new level.</p>



<h4 class="wp-block-heading">Key Benefits</h4>



<ul class="wp-block-list">
<li>Improves understanding of code readability and maintainability</li>



<li>Enhances coding efficiency</li>



<li>Boosts team productivity</li>
</ul>



<h4 class="wp-block-heading">Pros</h4>



<ul class="wp-block-list">
<li>Practical, real-world examples</li>



<li>Comprehensive guide to coding best practices</li>



<li>Written by a highly respected industry expert</li>
</ul>



<h4 class="wp-block-heading">Cons</h4>



<ul class="wp-block-list">
<li>The book&#8217;s principles may not apply to all coding languages</li>



<li>It may be challenging to implement some practices in a rigid corporate environment</li>
</ul>



<div class="wp-block-kadence-advancedbtn kb-buttons-wrap kb-btns3639_eed83c-fb"><a class="kb-button kt-button button kb-btn3639_640c08-dc kt-btn-size-standard kt-btn-width-type-full kb-btn-global-outline  kt-btn-has-text-true kt-btn-has-svg-true  wp-block-kadence-singlebtn" href="https://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882" target="_blank" rel="noopener"><span class="kt-btn-inner-text">Check Price on Amazon</span><span class="kb-svg-icon-wrap kb-svg-icon-fas_arrow-right kt-btn-icon-side-right"><svg viewBox="0 0 448 512"  fill="currentColor" xmlns="http://www.w3.org/2000/svg"  aria-hidden="true"><path d="M190.5 66.9l22.2-22.2c9.4-9.4 24.6-9.4 33.9 0L441 239c9.4 9.4 9.4 24.6 0 33.9L246.6 467.3c-9.4 9.4-24.6 9.4-33.9 0l-22.2-22.2c-9.5-9.5-9.3-25 .4-34.3L311.4 296H24c-13.3 0-24-10.7-24-24v-32c0-13.3 10.7-24 24-24h287.4L190.9 101.2c-9.8-9.3-10-24.8-.4-34.3z"/></svg></span></a></div>



<h3 class="wp-block-heading" id="the-clean-coder-a-code-of-conduct-for-professional-programmers">5. The Clean Coder: A Code of Conduct for Professional Programmers</h3>


<div class="kb-row-layout-wrap kb-row-layout-id3639_02be5c-4e alignnone wp-block-kadence-rowlayout"><div class="kt-row-column-wrap kt-has-1-columns kt-row-layout-equal kt-tab-layout-inherit kt-mobile-layout-row kt-row-valign-top">

<div class="wp-block-kadence-column kadence-column3639_301428-ac kb-section-dir-vertical inner-column-1"><div class="kt-inside-inner-col"><div class="kb-row-layout-wrap kb-row-layout-id3639_0105b8-b1 alignnone wp-block-kadence-rowlayout"><div class="kt-row-column-wrap kt-has-2-columns kt-row-layout-right-golden kt-tab-layout-inherit kt-mobile-layout-row kt-row-valign-top">

<div class="wp-block-kadence-column kadence-column3639_834d06-0b kb-section-dir-vertical inner-column-1"><div class="kt-inside-inner-col">
<div class="wp-block-kadence-image kb-image3639_bfa712-a4"><figure class="aligncenter"><img loading="lazy" decoding="async" width="1200" height="1565" src="https://eranstiller.com/wp-content/uploads/2023/09/The-Clean-Coder-A-Code-of-Conduct-for-Professional-Programmers-Cover.jpg" alt="Book cover of &quot;The Clean Coder: A Code of Conduct for Professional Programmers&quot;" class="kb-img wp-image-3667" srcset="https://eranstiller.com/wp-content/uploads/2023/09/The-Clean-Coder-A-Code-of-Conduct-for-Professional-Programmers-Cover.jpg 1200w, https://eranstiller.com/wp-content/uploads/2023/09/The-Clean-Coder-A-Code-of-Conduct-for-Professional-Programmers-Cover-230x300.jpg 230w, https://eranstiller.com/wp-content/uploads/2023/09/The-Clean-Coder-A-Code-of-Conduct-for-Professional-Programmers-Cover-785x1024.jpg 785w, https://eranstiller.com/wp-content/uploads/2023/09/The-Clean-Coder-A-Code-of-Conduct-for-Professional-Programmers-Cover-768x1002.jpg 768w, https://eranstiller.com/wp-content/uploads/2023/09/The-Clean-Coder-A-Code-of-Conduct-for-Professional-Programmers-Cover-1178x1536.jpg 1178w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /></figure></div>
</div></div>



<div class="wp-block-kadence-column kadence-column3639_56832a-9a inner-column-2"><div class="kt-inside-inner-col">
<p><strong>Authors</strong>: Robert C. Martin<br><strong>Publisher</strong>: Prentice Hall<br><strong>Latest Edition</strong>: 1st edition<br><strong>Publication Year</strong>: 2011<br><strong>Number of Pages</strong>: 256<br><strong>Target Audience</strong>: Professional programmers looking to enhance their careers through better work habits and a professional approach to software development.</p>



<div class="wp-block-kadence-advancedbtn kb-buttons-wrap kb-btns3639_758f72-70"><a class="kb-button kt-button button kb-btn3639_5cdb91-5a kt-btn-size-standard kt-btn-width-type-full kb-btn-global-outline  kt-btn-has-text-true kt-btn-has-svg-true  wp-block-kadence-singlebtn" href="https://www.amazon.com/Clean-Coder-Conduct-Professional-Programmers/dp/B08X7MNTCX" target="_blank" rel="noopener"><span class="kt-btn-inner-text">Check Price on Amazon</span><span class="kb-svg-icon-wrap kb-svg-icon-fas_arrow-right kt-btn-icon-side-right"><svg viewBox="0 0 448 512"  fill="currentColor" xmlns="http://www.w3.org/2000/svg"  aria-hidden="true"><path d="M190.5 66.9l22.2-22.2c9.4-9.4 24.6-9.4 33.9 0L441 239c9.4 9.4 9.4 24.6 0 33.9L246.6 467.3c-9.4 9.4-24.6 9.4-33.9 0l-22.2-22.2c-9.5-9.5-9.3-25 .4-34.3L311.4 296H24c-13.3 0-24-10.7-24-24v-32c0-13.3 10.7-24 24-24h287.4L190.9 101.2c-9.8-9.3-10-24.8-.4-34.3z"/></svg></span></a></div>
</div></div>

</div></div></div></div>

</div></div>


<p>You&#8217;ll find an equally indispensable resource in Robert C. Martin&#8217;s &#8220;The Clean Coder: A Code of Conduct for Professional Programmers.&#8221; This guide is less about the mechanics of coding and more about the ethics and responsibilities of being a professional in the field.</p>



<p>This book is a beacon for all who aspire to master the art of programming while maintaining high professionalism. It delves into critical aspects such as time management, teamwork, problem-solving, and career development. Its practical advice, derived from real-world scenarios, emphasizes the significance of conducting oneself ethically and responsibly within the tech industry.</p>



<h4 class="wp-block-heading">Key Benefits</h4>



<ul class="wp-block-list">
<li>Enhances professional conduct</li>



<li>Promotes ethical behavior</li>



<li>Improves teamwork and problem-solving</li>
</ul>



<h4 class="wp-block-heading">Pros</h4>



<ul class="wp-block-list">
<li>Insightful, real-world examples</li>



<li>Comprehensive coverage of professional conduct</li>



<li>Practical advice on career development</li>
</ul>



<h4 class="wp-block-heading">Cons</h4>



<ul class="wp-block-list">
<li>Less emphasis on coding mechanics</li>



<li>Requires a significant level of commitment</li>



<li>Some concepts may be challenging for beginners</li>
</ul>



<div class="wp-block-kadence-advancedbtn kb-buttons-wrap kb-btns3639_bae483-0e"><a class="kb-button kt-button button kb-btn3639_1cab0f-f1 kt-btn-size-standard kt-btn-width-type-full kb-btn-global-outline  kt-btn-has-text-true kt-btn-has-svg-true  wp-block-kadence-singlebtn" href="https://www.amazon.com/Clean-Coder-Conduct-Professional-Programmers/dp/B08X7MNTCX" target="_blank" rel="noopener"><span class="kt-btn-inner-text">Check Price on Amazon</span><span class="kb-svg-icon-wrap kb-svg-icon-fas_arrow-right kt-btn-icon-side-right"><svg viewBox="0 0 448 512"  fill="currentColor" xmlns="http://www.w3.org/2000/svg"  aria-hidden="true"><path d="M190.5 66.9l22.2-22.2c9.4-9.4 24.6-9.4 33.9 0L441 239c9.4 9.4 9.4 24.6 0 33.9L246.6 467.3c-9.4 9.4-24.6 9.4-33.9 0l-22.2-22.2c-9.5-9.5-9.3-25 .4-34.3L311.4 296H24c-13.3 0-24-10.7-24-24v-32c0-13.3 10.7-24 24-24h287.4L190.9 101.2c-9.8-9.3-10-24.8-.4-34.3z"/></svg></span></a></div>



<h3 class="wp-block-heading" id="the-pragmatic-programmer-your-journey-to-mastery">6. The Pragmatic Programmer: Your Journey to Mastery</h3>


<div class="kb-row-layout-wrap kb-row-layout-id3639_50e298-d9 alignnone wp-block-kadence-rowlayout"><div class="kt-row-column-wrap kt-has-1-columns kt-row-layout-equal kt-tab-layout-inherit kt-mobile-layout-row kt-row-valign-top">

<div class="wp-block-kadence-column kadence-column3639_8ffe90-26 kb-section-dir-vertical inner-column-1"><div class="kt-inside-inner-col"><div class="kb-row-layout-wrap kb-row-layout-id3639_13f3b2-35 alignnone wp-block-kadence-rowlayout"><div class="kt-row-column-wrap kt-has-2-columns kt-row-layout-right-golden kt-tab-layout-inherit kt-mobile-layout-row kt-row-valign-top">

<div class="wp-block-kadence-column kadence-column3639_7f63d6-80 kb-section-dir-vertical inner-column-1"><div class="kt-inside-inner-col">
<div class="wp-block-kadence-image kb-image3639_aa7357-75"><figure class="aligncenter"><img loading="lazy" decoding="async" width="1200" height="1565" src="https://eranstiller.com/wp-content/uploads/2023/09/The-Pragmatic-Programmer-Your-Journey-to-Mastery-Cover.jpg" alt="Book cover of &quot; The Pragmatic Programmer: Your Journey to Mastery&quot;" class="kb-img wp-image-3668" srcset="https://eranstiller.com/wp-content/uploads/2023/09/The-Pragmatic-Programmer-Your-Journey-to-Mastery-Cover.jpg 1200w, https://eranstiller.com/wp-content/uploads/2023/09/The-Pragmatic-Programmer-Your-Journey-to-Mastery-Cover-230x300.jpg 230w, https://eranstiller.com/wp-content/uploads/2023/09/The-Pragmatic-Programmer-Your-Journey-to-Mastery-Cover-785x1024.jpg 785w, https://eranstiller.com/wp-content/uploads/2023/09/The-Pragmatic-Programmer-Your-Journey-to-Mastery-Cover-768x1002.jpg 768w, https://eranstiller.com/wp-content/uploads/2023/09/The-Pragmatic-Programmer-Your-Journey-to-Mastery-Cover-1178x1536.jpg 1178w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /></figure></div>
</div></div>



<div class="wp-block-kadence-column kadence-column3639_ee65e7-c5 inner-column-2"><div class="kt-inside-inner-col">
<p><strong>Authors</strong>: Andrew Hunt and David Thomas<br><strong>Publisher</strong>: Addison-Wesley<br><strong>Latest Edition</strong>: 2nd edition<br><strong>Publication Year</strong>: 2019<br><strong>Number of Pages</strong>: 352<br><strong>Target Audience</strong>: Software developers, both novices and experienced, seeking to cultivate a pragmatic approach to programming.</p>



<div class="wp-block-kadence-advancedbtn kb-buttons-wrap kb-btns3639_91d014-fb"><a class="kb-button kt-button button kb-btn3639_38cf2a-55 kt-btn-size-standard kt-btn-width-type-full kb-btn-global-outline  kt-btn-has-text-true kt-btn-has-svg-true  wp-block-kadence-singlebtn" href="https://www.amazon.com/Pragmatic-Programmer-journey-mastery-Anniversary/dp/0135957052" target="_blank" rel="noopener"><span class="kt-btn-inner-text">Check Price on Amazon</span><span class="kb-svg-icon-wrap kb-svg-icon-fas_arrow-right kt-btn-icon-side-right"><svg viewBox="0 0 448 512"  fill="currentColor" xmlns="http://www.w3.org/2000/svg"  aria-hidden="true"><path d="M190.5 66.9l22.2-22.2c9.4-9.4 24.6-9.4 33.9 0L441 239c9.4 9.4 9.4 24.6 0 33.9L246.6 467.3c-9.4 9.4-24.6 9.4-33.9 0l-22.2-22.2c-9.5-9.5-9.3-25 .4-34.3L311.4 296H24c-13.3 0-24-10.7-24-24v-32c0-13.3 10.7-24 24-24h287.4L190.9 101.2c-9.8-9.3-10-24.8-.4-34.3z"/></svg></span></a></div>
</div></div>

</div></div></div></div>

</div></div>


<p>Diving into &#8220;The Pragmatic Programmer: Your Journey to Mastery,&#8221; you&#8217;ll uncover a wealth of knowledge that&#8217;ll transform your approach to coding. This book guides you through the maze of complex programming concepts with clear, concise explanations and practical examples. You&#8217;ll learn to write more efficient&nbsp;code, consider edge cases, and effectively debug software.</p>



<p>By the end of this book, you&#8217;ll have enhanced problem-solving skills, a deeper understanding of algorithms, and a comprehensive view of software architecture. The key takeaway? Programming isn&#8217;t just about writing code &#8211; it&#8217;s about solving problems efficiently and in a maintainable way.</p>



<h4 class="wp-block-heading">Key Benefits</h4>



<ul class="wp-block-list">
<li>Enhances problem-solving skills</li>



<li>Teaches efficient coding practices</li>



<li>Gives a comprehensive view of software architecture</li>
</ul>



<h4 class="wp-block-heading">Pros</h4>



<ul class="wp-block-list">
<li>Clear, concise explanations</li>



<li>Practical, real-world examples</li>



<li>In-depth coverage of complex programming concepts</li>
</ul>



<h4 class="wp-block-heading">Cons</h4>



<ul class="wp-block-list">
<li>Some concepts may seem abstract without practical implementation</li>



<li>Requires a significant time investment to benefit from its insights fully</li>
</ul>



<div class="wp-block-kadence-advancedbtn kb-buttons-wrap kb-btns3639_c07364-5d"><a class="kb-button kt-button button kb-btn3639_101140-83 kt-btn-size-standard kt-btn-width-type-full kb-btn-global-outline  kt-btn-has-text-true kt-btn-has-svg-true  wp-block-kadence-singlebtn" href="https://www.amazon.com/Pragmatic-Programmer-journey-mastery-Anniversary/dp/0135957052" target="_blank" rel="noopener"><span class="kt-btn-inner-text">Check Price on Amazon</span><span class="kb-svg-icon-wrap kb-svg-icon-fas_arrow-right kt-btn-icon-side-right"><svg viewBox="0 0 448 512"  fill="currentColor" xmlns="http://www.w3.org/2000/svg"  aria-hidden="true"><path d="M190.5 66.9l22.2-22.2c9.4-9.4 24.6-9.4 33.9 0L441 239c9.4 9.4 9.4 24.6 0 33.9L246.6 467.3c-9.4 9.4-24.6 9.4-33.9 0l-22.2-22.2c-9.5-9.5-9.3-25 .4-34.3L311.4 296H24c-13.3 0-24-10.7-24-24v-32c0-13.3 10.7-24 24-24h287.4L190.9 101.2c-9.8-9.3-10-24.8-.4-34.3z"/></svg></span></a></div>



<h3 class="wp-block-heading" id="the-mythical-man-month-essays-on-software-engineering">7. The Mythical Man-Month: Essays on Software Engineering</h3>


<div class="kb-row-layout-wrap kb-row-layout-id3639_b3b46b-79 alignnone wp-block-kadence-rowlayout"><div class="kt-row-column-wrap kt-has-1-columns kt-row-layout-equal kt-tab-layout-inherit kt-mobile-layout-row kt-row-valign-top">

<div class="wp-block-kadence-column kadence-column3639_0cca95-86 kb-section-dir-vertical inner-column-1"><div class="kt-inside-inner-col"><div class="kb-row-layout-wrap kb-row-layout-id3639_e41268-ac alignnone wp-block-kadence-rowlayout"><div class="kt-row-column-wrap kt-has-2-columns kt-row-layout-right-golden kt-tab-layout-inherit kt-mobile-layout-row kt-row-valign-top">

<div class="wp-block-kadence-column kadence-column3639_c4b04c-3c kb-section-dir-vertical inner-column-1"><div class="kt-inside-inner-col">
<div class="wp-block-kadence-image kb-image3639_6d831f-7b"><figure class="aligncenter"><img loading="lazy" decoding="async" width="1200" height="1788" src="https://eranstiller.com/wp-content/uploads/2023/09/The-Mythical-Man-Month-Essays-on-Software-Engineering-Cover.jpg" alt="Book cover of &quot;The Mythical Man-Month: Essays on Software Engineering&quot;" class="kb-img wp-image-3670" srcset="https://eranstiller.com/wp-content/uploads/2023/09/The-Mythical-Man-Month-Essays-on-Software-Engineering-Cover.jpg 1200w, https://eranstiller.com/wp-content/uploads/2023/09/The-Mythical-Man-Month-Essays-on-Software-Engineering-Cover-201x300.jpg 201w, https://eranstiller.com/wp-content/uploads/2023/09/The-Mythical-Man-Month-Essays-on-Software-Engineering-Cover-687x1024.jpg 687w, https://eranstiller.com/wp-content/uploads/2023/09/The-Mythical-Man-Month-Essays-on-Software-Engineering-Cover-768x1144.jpg 768w, https://eranstiller.com/wp-content/uploads/2023/09/The-Mythical-Man-Month-Essays-on-Software-Engineering-Cover-1031x1536.jpg 1031w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /></figure></div>
</div></div>



<div class="wp-block-kadence-column kadence-column3639_881816-13 inner-column-2"><div class="kt-inside-inner-col">
<p><strong>Author</strong>: Frederick P. Brooks Jr.<br><strong>Publisher</strong>: Addison-Wesley<br><strong>Latest Edition</strong>: 2nd edition<br><strong>Publication Year</strong>: 1995<br><strong>Number of Pages</strong>: 336<br><strong>Target Audience</strong>: Software engineers and project managers interested in the human aspects of software development.</p>



<div class="wp-block-kadence-advancedbtn kb-buttons-wrap kb-btns3639_38ad33-76"><a class="kb-button kt-button button kb-btn3639_e4375c-34 kt-btn-size-standard kt-btn-width-type-full kb-btn-global-outline  kt-btn-has-text-true kt-btn-has-svg-true  wp-block-kadence-singlebtn" href="https://www.amazon.com/Mythical-Man-Month-Software-Engineering-Anniversary/dp/0201835959" target="_blank" rel="noopener"><span class="kt-btn-inner-text">Check Price on Amazon</span><span class="kb-svg-icon-wrap kb-svg-icon-fas_arrow-right kt-btn-icon-side-right"><svg viewBox="0 0 448 512"  fill="currentColor" xmlns="http://www.w3.org/2000/svg"  aria-hidden="true"><path d="M190.5 66.9l22.2-22.2c9.4-9.4 24.6-9.4 33.9 0L441 239c9.4 9.4 9.4 24.6 0 33.9L246.6 467.3c-9.4 9.4-24.6 9.4-33.9 0l-22.2-22.2c-9.5-9.5-9.3-25 .4-34.3L311.4 296H24c-13.3 0-24-10.7-24-24v-32c0-13.3 10.7-24 24-24h287.4L190.9 101.2c-9.8-9.3-10-24.8-.4-34.3z"/></svg></span></a></div>
</div></div>

</div></div></div></div>

</div></div>


<p>&#8220;The Mythical Man-Month: Essays on Software Engineering&#8221; is a classic text offering valuable insights into project management and team dynamics. This book, penned by Fred Brooks, teaches software engineers essential concepts such as the fallacy of man-month, the second-system effect, and the law of diminishing returns in software engineering.</p>



<p>Brooks&#8217; work challenges conventional wisdom, arguing that adding human resources to a late software project only makes it later. He emphasizes that communication overheads increase as the number of people increases, leading to inefficiencies.</p>



<h4 class="wp-block-heading">Key Benefits</h4>



<ul class="wp-block-list">
<li>Better understanding of project management</li>



<li>Insights into team dynamics</li>



<li>Practical software engineering principles</li>
</ul>



<h4 class="wp-block-heading">Pros</h4>



<ul class="wp-block-list">
<li>Timeless advice and insights</li>



<li>Clear and concise writing style</li>



<li>Relevant for all levels of software development</li>
</ul>



<h4 class="wp-block-heading">Cons</h4>



<ul class="wp-block-list">
<li>Some examples may seem outdated</li>



<li>Theories might not apply to all project types</li>



<li>Lacks focus on modern Agile methodologies</li>
</ul>



<div class="wp-block-kadence-advancedbtn kb-buttons-wrap kb-btns3639_cf59b9-73"><a class="kb-button kt-button button kb-btn3639_a0c0c5-6c kt-btn-size-standard kt-btn-width-type-full kb-btn-global-outline  kt-btn-has-text-true kt-btn-has-svg-true  wp-block-kadence-singlebtn" href="https://www.amazon.com/Mythical-Man-Month-Software-Engineering-Anniversary/dp/0201835959" target="_blank" rel="noopener"><span class="kt-btn-inner-text">Check Price on Amazon</span><span class="kb-svg-icon-wrap kb-svg-icon-fas_arrow-right kt-btn-icon-side-right"><svg viewBox="0 0 448 512"  fill="currentColor" xmlns="http://www.w3.org/2000/svg"  aria-hidden="true"><path d="M190.5 66.9l22.2-22.2c9.4-9.4 24.6-9.4 33.9 0L441 239c9.4 9.4 9.4 24.6 0 33.9L246.6 467.3c-9.4 9.4-24.6 9.4-33.9 0l-22.2-22.2c-9.5-9.5-9.3-25 .4-34.3L311.4 296H24c-13.3 0-24-10.7-24-24v-32c0-13.3 10.7-24 24-24h287.4L190.9 101.2c-9.8-9.3-10-24.8-.4-34.3z"/></svg></span></a></div>



<h3 class="wp-block-heading" id="patterns-of-enterprise-application-architecture">8. Patterns of Enterprise Application Architecture</h3>


<div class="kb-row-layout-wrap kb-row-layout-id3639_02d2d9-c4 alignnone wp-block-kadence-rowlayout"><div class="kt-row-column-wrap kt-has-1-columns kt-row-layout-equal kt-tab-layout-inherit kt-mobile-layout-row kt-row-valign-top">

<div class="wp-block-kadence-column kadence-column3639_3bb6ac-67 kb-section-dir-vertical inner-column-1"><div class="kt-inside-inner-col"><div class="kb-row-layout-wrap kb-row-layout-id3639_a8a6c7-10 alignnone wp-block-kadence-rowlayout"><div class="kt-row-column-wrap kt-has-2-columns kt-row-layout-right-golden kt-tab-layout-inherit kt-mobile-layout-row kt-row-valign-top">

<div class="wp-block-kadence-column kadence-column3639_6df745-a3 kb-section-dir-vertical inner-column-1"><div class="kt-inside-inner-col">
<div class="wp-block-kadence-image kb-image3639_491711-3d"><figure class="aligncenter"><img loading="lazy" decoding="async" width="399" height="500" src="https://eranstiller.com/wp-content/uploads/2023/09/Patterns-of-Enterprise-Application-Architecture-Cover.jpg" alt="Book cover of &quot;Patterns of Enterprise Application Architecture&quot;" class="kb-img wp-image-3672" srcset="https://eranstiller.com/wp-content/uploads/2023/09/Patterns-of-Enterprise-Application-Architecture-Cover.jpg 399w, https://eranstiller.com/wp-content/uploads/2023/09/Patterns-of-Enterprise-Application-Architecture-Cover-239x300.jpg 239w" sizes="auto, (max-width: 399px) 100vw, 399px" /></figure></div>
</div></div>



<div class="wp-block-kadence-column kadence-column3639_fb6e43-db inner-column-2"><div class="kt-inside-inner-col">
<p><strong>Author</strong>: Martin Fowler<br><strong>Publisher</strong>: Addison-Wesley<br><strong>Latest Edition</strong>: 1st edition<br><strong>Publication Year</strong>: 2002<br><strong>Number of Pages</strong>: 560<br><strong>Target Audience</strong>: Software developers and architects working on enterprise-level applications.</p>



<div class="wp-block-kadence-advancedbtn kb-buttons-wrap kb-btns3639_a259de-ec"><a class="kb-button kt-button button kb-btn3639_b07abd-08 kt-btn-size-standard kt-btn-width-type-full kb-btn-global-outline  kt-btn-has-text-true kt-btn-has-svg-true  wp-block-kadence-singlebtn" href="https://www.amazon.com/Patterns-Enterprise-Application-Architecture-Martin/dp/0321127420" target="_blank" rel="noopener"><span class="kt-btn-inner-text">Check Price on Amazon</span><span class="kb-svg-icon-wrap kb-svg-icon-fas_arrow-right kt-btn-icon-side-right"><svg viewBox="0 0 448 512"  fill="currentColor" xmlns="http://www.w3.org/2000/svg"  aria-hidden="true"><path d="M190.5 66.9l22.2-22.2c9.4-9.4 24.6-9.4 33.9 0L441 239c9.4 9.4 9.4 24.6 0 33.9L246.6 467.3c-9.4 9.4-24.6 9.4-33.9 0l-22.2-22.2c-9.5-9.5-9.3-25 .4-34.3L311.4 296H24c-13.3 0-24-10.7-24-24v-32c0-13.3 10.7-24 24-24h287.4L190.9 101.2c-9.8-9.3-10-24.8-.4-34.3z"/></svg></span></a></div>
</div></div>

</div></div></div></div>

</div></div>


<p>Moving onto &#8220;Patterns of Enterprise Application Architecture,&#8221; you&#8217;ll find a collection of blueprints for solving common software system design problems. This book will help you with a wealth of knowledge on enterprise application development. You&#8217;ll get to understand how to design and implement complex systems in a more manageable and comprehensible way.</p>



<p>In &#8220;Patterns of Enterprise Application Architecture,&#8221; you&#8217;ll delve into intricate types of software patterns like Model-View-Controller (MVC), Active Record, and Unit of Work. These patterns aren&#8217;t just theoretical constructs but are practical solutions for building software, distilled from years of developer experience.</p>



<h4 class="wp-block-heading">Key Benefits</h4>



<ul class="wp-block-list">
<li>Provides practical solutions to commonly encountered enterprise development problems</li>



<li>Offers a comprehensive guide to the most valuable patterns in enterprise architecture</li>



<li>Enhances your ability to design and implement complex systems</li>
</ul>



<h4 class="wp-block-heading">Pros</h4>



<ul class="wp-block-list">
<li>Provides detailed, real-world examples</li>



<li>Written by a respected authority in the field</li>



<li>Acts as a reference guide for various design patterns</li>
</ul>



<h4 class="wp-block-heading">Cons</h4>



<ul class="wp-block-list">
<li>Can be dense and complex for beginners</li>



<li>Some patterns may be outdated due to technological advancements</li>



<li>Requires a solid understanding of object-oriented programming and design principles</li>
</ul>



<div class="wp-block-kadence-advancedbtn kb-buttons-wrap kb-btns3639_6ef7df-35"><a class="kb-button kt-button button kb-btn3639_b1668f-bf kt-btn-size-standard kt-btn-width-type-full kb-btn-global-outline  kt-btn-has-text-true kt-btn-has-svg-true  wp-block-kadence-singlebtn" href="https://www.amazon.com/Patterns-Enterprise-Application-Architecture-Martin/dp/0321127420" target="_blank" rel="noopener"><span class="kt-btn-inner-text">Check Price on Amazon</span><span class="kb-svg-icon-wrap kb-svg-icon-fas_arrow-right kt-btn-icon-side-right"><svg viewBox="0 0 448 512"  fill="currentColor" xmlns="http://www.w3.org/2000/svg"  aria-hidden="true"><path d="M190.5 66.9l22.2-22.2c9.4-9.4 24.6-9.4 33.9 0L441 239c9.4 9.4 9.4 24.6 0 33.9L246.6 467.3c-9.4 9.4-24.6 9.4-33.9 0l-22.2-22.2c-9.5-9.5-9.3-25 .4-34.3L311.4 296H24c-13.3 0-24-10.7-24-24v-32c0-13.3 10.7-24 24-24h287.4L190.9 101.2c-9.8-9.3-10-24.8-.4-34.3z"/></svg></span></a></div>



<h3 class="wp-block-heading" id="refactoring-improving-the-design-of-existing-code">9. Refactoring: Improving the Design of Existing Code</h3>


<div class="kb-row-layout-wrap kb-row-layout-id3639_daf4f5-de alignnone wp-block-kadence-rowlayout"><div class="kt-row-column-wrap kt-has-1-columns kt-row-layout-equal kt-tab-layout-inherit kt-mobile-layout-row kt-row-valign-top">

<div class="wp-block-kadence-column kadence-column3639_18f719-47 kb-section-dir-vertical inner-column-1"><div class="kt-inside-inner-col"><div class="kb-row-layout-wrap kb-row-layout-id3639_6229bc-7b alignnone wp-block-kadence-rowlayout"><div class="kt-row-column-wrap kt-has-2-columns kt-row-layout-right-golden kt-tab-layout-inherit kt-mobile-layout-row kt-row-valign-top">

<div class="wp-block-kadence-column kadence-column3639_69780f-be kb-section-dir-vertical inner-column-1"><div class="kt-inside-inner-col">
<div class="wp-block-kadence-image kb-image3639_e57f02-d0"><figure class="aligncenter"><img loading="lazy" decoding="async" width="404" height="500" src="https://eranstiller.com/wp-content/uploads/2023/09/Refactoring-Improving-the-Design-of-Existing-Code-Cover.jpg" alt="Book cover of &quot;Refactoring: Improving the Design of Existing Code&quot;" class="kb-img wp-image-3674" srcset="https://eranstiller.com/wp-content/uploads/2023/09/Refactoring-Improving-the-Design-of-Existing-Code-Cover.jpg 404w, https://eranstiller.com/wp-content/uploads/2023/09/Refactoring-Improving-the-Design-of-Existing-Code-Cover-242x300.jpg 242w" sizes="auto, (max-width: 404px) 100vw, 404px" /></figure></div>
</div></div>



<div class="wp-block-kadence-column kadence-column3639_26c19e-85 inner-column-2"><div class="kt-inside-inner-col">
<p><strong>Author</strong>: Martin Fowler<br><strong>Publisher</strong>: Addison-Wesley<br><strong>Latest Edition</strong>: 2nd edition<br><strong>Publication Year</strong>: 2018<br><strong>Number of Pages</strong>: 448<br><strong>Target Audience</strong>: Experienced programmers looking to improve and maintain the structure of existing codebases.</p>



<div class="wp-block-kadence-advancedbtn kb-buttons-wrap kb-btns3639_e575da-e9"><a class="kb-button kt-button button kb-btn3639_66495b-c7 kt-btn-size-standard kt-btn-width-type-full kb-btn-global-outline  kt-btn-has-text-true kt-btn-has-svg-true  wp-block-kadence-singlebtn" href="https://www.amazon.com/Refactoring-Improving-Existing-Addison-Wesley-Signature/dp/0134757599" target="_blank" rel="noopener"><span class="kt-btn-inner-text">Check Price on Amazon</span><span class="kb-svg-icon-wrap kb-svg-icon-fas_arrow-right kt-btn-icon-side-right"><svg viewBox="0 0 448 512"  fill="currentColor" xmlns="http://www.w3.org/2000/svg"  aria-hidden="true"><path d="M190.5 66.9l22.2-22.2c9.4-9.4 24.6-9.4 33.9 0L441 239c9.4 9.4 9.4 24.6 0 33.9L246.6 467.3c-9.4 9.4-24.6 9.4-33.9 0l-22.2-22.2c-9.5-9.5-9.3-25 .4-34.3L311.4 296H24c-13.3 0-24-10.7-24-24v-32c0-13.3 10.7-24 24-24h287.4L190.9 101.2c-9.8-9.3-10-24.8-.4-34.3z"/></svg></span></a></div>
</div></div>

</div></div></div></div>

</div></div>


<p>On to &#8220;Refactoring: Improving the Design of Existing Code,&#8221; one of the best books for software craftsmen. You&#8217;ll learn practical techniques to improve and optimize your existing codebase without changing its behavior. This book is a treasure trove of knowledge, offering in-depth insights into refining code to make it cleaner, more efficient, and easier to understand. It&#8217;s not about rewriting; it&#8217;s about enhancing and fine-tuning.</p>



<p>You&#8217;ll discover how to recognize &#8220;code smells&#8221; &#8211; those tell-tale signs of underlying problems &#8211; and how to apply the right &#8220;refactoring&#8221; to remedy them.</p>



<h4 class="wp-block-heading">Key Benefits</h4>



<ul class="wp-block-list">
<li>Enhances your ability to maintain and improve existing code</li>



<li>Develop your skill in identifying problematic code</li>



<li>Provides practical examples and solutions for common code issues</li>
</ul>



<h4 class="wp-block-heading">Pros</h4>



<ul class="wp-block-list">
<li>A comprehensive guide to the art of refactoring</li>



<li>Engaging and easy-to-understand content</li>



<li>Offers actionable advice and techniques</li>
</ul>



<h4 class="wp-block-heading">Cons</h4>



<ul class="wp-block-list">
<li>May be too advanced for beginners</li>



<li>Requires time and practice to apply techniques fully</li>
</ul>



<div class="wp-block-kadence-advancedbtn kb-buttons-wrap kb-btns3639_f73f3c-6c"><a class="kb-button kt-button button kb-btn3639_aa266f-05 kt-btn-size-standard kt-btn-width-type-full kb-btn-global-outline  kt-btn-has-text-true kt-btn-has-svg-true  wp-block-kadence-singlebtn" href="https://www.amazon.com/Refactoring-Improving-Existing-Addison-Wesley-Signature/dp/0134757599" target="_blank" rel="noopener"><span class="kt-btn-inner-text">Check Price on Amazon</span><span class="kb-svg-icon-wrap kb-svg-icon-fas_arrow-right kt-btn-icon-side-right"><svg viewBox="0 0 448 512"  fill="currentColor" xmlns="http://www.w3.org/2000/svg"  aria-hidden="true"><path d="M190.5 66.9l22.2-22.2c9.4-9.4 24.6-9.4 33.9 0L441 239c9.4 9.4 9.4 24.6 0 33.9L246.6 467.3c-9.4 9.4-24.6 9.4-33.9 0l-22.2-22.2c-9.5-9.5-9.3-25 .4-34.3L311.4 296H24c-13.3 0-24-10.7-24-24v-32c0-13.3 10.7-24 24-24h287.4L190.9 101.2c-9.8-9.3-10-24.8-.4-34.3z"/></svg></span></a></div>



<h3 class="wp-block-heading" id="working-effectively-with-lagacy-code">10. Working Effectively With Legacy Code</h3>


<div class="kb-row-layout-wrap kb-row-layout-id3639_96bc7d-25 alignnone wp-block-kadence-rowlayout"><div class="kt-row-column-wrap kt-has-1-columns kt-row-layout-equal kt-tab-layout-inherit kt-mobile-layout-row kt-row-valign-top">

<div class="wp-block-kadence-column kadence-column3639_035fe8-59 kb-section-dir-vertical inner-column-1"><div class="kt-inside-inner-col"><div class="kb-row-layout-wrap kb-row-layout-id3639_809a24-4f alignnone wp-block-kadence-rowlayout"><div class="kt-row-column-wrap kt-has-2-columns kt-row-layout-right-golden kt-tab-layout-inherit kt-mobile-layout-row kt-row-valign-top">

<div class="wp-block-kadence-column kadence-column3639_050e5f-ee kb-section-dir-vertical inner-column-1"><div class="kt-inside-inner-col">
<div class="wp-block-kadence-image kb-image3639_31deaa-11"><figure class="aligncenter"><img loading="lazy" decoding="async" width="754" height="1000" src="https://eranstiller.com/wp-content/uploads/2023/09/Working-Effectively-With-Legacy-Code-Cover.jpg" alt="Book cover of &quot;Working Effectively With Legacy Code&quot;" class="kb-img wp-image-3676" srcset="https://eranstiller.com/wp-content/uploads/2023/09/Working-Effectively-With-Legacy-Code-Cover.jpg 754w, https://eranstiller.com/wp-content/uploads/2023/09/Working-Effectively-With-Legacy-Code-Cover-226x300.jpg 226w" sizes="auto, (max-width: 754px) 100vw, 754px" /></figure></div>
</div></div>



<div class="wp-block-kadence-column kadence-column3639_1828f3-e2 inner-column-2"><div class="kt-inside-inner-col">
<p><strong>Authors</strong>: Michael Feathers<br><strong>Publisher</strong>: Pearson<br><strong>Latest Edition</strong>: 1st edition<br><strong>Publication Year</strong>: 2004<br><strong>Number of Pages</strong>: 464<br><strong>Target Audience</strong>: Developers working on legacy systems seeking strategies for safely making changes and improvements.</p>



<div class="wp-block-kadence-advancedbtn kb-buttons-wrap kb-btns3639_93c7cd-72"><a class="kb-button kt-button button kb-btn3639_3ed3d4-a6 kt-btn-size-standard kt-btn-width-type-full kb-btn-global-outline  kt-btn-has-text-true kt-btn-has-svg-true  wp-block-kadence-singlebtn" href="https://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052" target="_blank" rel="noopener"><span class="kt-btn-inner-text">Check Price on Amazon</span><span class="kb-svg-icon-wrap kb-svg-icon-fas_arrow-right kt-btn-icon-side-right"><svg viewBox="0 0 448 512"  fill="currentColor" xmlns="http://www.w3.org/2000/svg"  aria-hidden="true"><path d="M190.5 66.9l22.2-22.2c9.4-9.4 24.6-9.4 33.9 0L441 239c9.4 9.4 9.4 24.6 0 33.9L246.6 467.3c-9.4 9.4-24.6 9.4-33.9 0l-22.2-22.2c-9.5-9.5-9.3-25 .4-34.3L311.4 296H24c-13.3 0-24-10.7-24-24v-32c0-13.3 10.7-24 24-24h287.4L190.9 101.2c-9.8-9.3-10-24.8-.4-34.3z"/></svg></span></a></div>
</div></div>

</div></div></div></div>

</div></div>


<p>You need to read &#8220;Working Effectively With Legacy Code&#8221; to uncover strategies for dealing with older, problematic code that isn&#8217;t easy to understand or change. You&#8217;ll learn the importance of identifying &#8220;seams&#8221; in the code and locations where you can alter behavior without modifying the code. You&#8217;ll also discover the &#8220;scratch refactoring&#8221; technique, allowing you to understand confusing code by rewriting it.</p>



<p>This book shows you how to write tests for legacy code, even when it seems impossible. You&#8217;ll grasp how to break dependencies in the code, making it less intertwined and easier to work with. You&#8217;ll appreciate the practical, real-world examples that help illustrate these techniques.</p>



<h4 class="wp-block-heading">Key Benefits</h4>



<ul class="wp-block-list">
<li>Learn to understand and modify confusing, complex code</li>



<li>Gain strategies for writing tests for legacy code</li>



<li>Discover techniques for breaking dependencies in code</li>
</ul>



<h4 class="wp-block-heading">Pros</h4>



<ul class="wp-block-list">
<li>Practical, real-world examples</li>



<li>Extensive technical knowledge provided</li>
</ul>



<h4 class="wp-block-heading">Cons</h4>



<ul class="wp-block-list">
<li>Some methods may be too advanced for beginners</li>



<li>Strategies may not apply to all coding languages</li>
</ul>



<div class="wp-block-kadence-advancedbtn kb-buttons-wrap kb-btns3639_80b22c-1f"><a class="kb-button kt-button button kb-btn3639_48aa6c-5f kt-btn-size-standard kt-btn-width-type-full kb-btn-global-outline  kt-btn-has-text-true kt-btn-has-svg-true  wp-block-kadence-singlebtn" href="https://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052" target="_blank" rel="noopener"><span class="kt-btn-inner-text">Check Price on Amazon</span><span class="kb-svg-icon-wrap kb-svg-icon-fas_arrow-right kt-btn-icon-side-right"><svg viewBox="0 0 448 512"  fill="currentColor" xmlns="http://www.w3.org/2000/svg"  aria-hidden="true"><path d="M190.5 66.9l22.2-22.2c9.4-9.4 24.6-9.4 33.9 0L441 239c9.4 9.4 9.4 24.6 0 33.9L246.6 467.3c-9.4 9.4-24.6 9.4-33.9 0l-22.2-22.2c-9.5-9.5-9.3-25 .4-34.3L311.4 296H24c-13.3 0-24-10.7-24-24v-32c0-13.3 10.7-24 24-24h287.4L190.9 101.2c-9.8-9.3-10-24.8-.4-34.3z"/></svg></span></a></div>



<h3 class="wp-block-heading" id="code-the-hidden-language-of-computer-hardware-and-software">11. Code: The Hidden Language of Computer Hardware and Software</h3>


<div class="kb-row-layout-wrap kb-row-layout-id3639_9da8b4-a0 alignnone wp-block-kadence-rowlayout"><div class="kt-row-column-wrap kt-has-1-columns kt-row-layout-equal kt-tab-layout-inherit kt-mobile-layout-row kt-row-valign-top">

<div class="wp-block-kadence-column kadence-column3639_21680b-1c kb-section-dir-vertical inner-column-1"><div class="kt-inside-inner-col"><div class="kb-row-layout-wrap kb-row-layout-id3639_741345-9f alignnone wp-block-kadence-rowlayout"><div class="kt-row-column-wrap kt-has-2-columns kt-row-layout-right-golden kt-tab-layout-inherit kt-mobile-layout-row kt-row-valign-top">

<div class="wp-block-kadence-column kadence-column3639_bcca99-d0 kb-section-dir-vertical inner-column-1"><div class="kt-inside-inner-col">
<div class="wp-block-kadence-image kb-image3639_1fe8f1-3a"><figure class="aligncenter"><img loading="lazy" decoding="async" width="900" height="1350" src="https://eranstiller.com/wp-content/uploads/2023/09/Code-The-Hidden-Language-of-Computer-Hardware-and-Software-Cover.jpg" alt="Book cover of &quot;Code: The Hidden Language of Computer Hardware and Software&quot;" class="kb-img wp-image-3677" srcset="https://eranstiller.com/wp-content/uploads/2023/09/Code-The-Hidden-Language-of-Computer-Hardware-and-Software-Cover.jpg 900w, https://eranstiller.com/wp-content/uploads/2023/09/Code-The-Hidden-Language-of-Computer-Hardware-and-Software-Cover-200x300.jpg 200w, https://eranstiller.com/wp-content/uploads/2023/09/Code-The-Hidden-Language-of-Computer-Hardware-and-Software-Cover-683x1024.jpg 683w, https://eranstiller.com/wp-content/uploads/2023/09/Code-The-Hidden-Language-of-Computer-Hardware-and-Software-Cover-768x1152.jpg 768w" sizes="auto, (max-width: 900px) 100vw, 900px" /></figure></div>
</div></div>



<div class="wp-block-kadence-column kadence-column3639_345565-45 inner-column-2"><div class="kt-inside-inner-col">
<p><strong>Author</strong>: Charles Petzold<br><strong>Publisher</strong>: Microsoft Press<br><strong>Latest Edition</strong>: 2nd edition<br><strong>Publication Year</strong>: 2022<br><strong>Number of Pages</strong>: 480<br><strong>Target Audience</strong>: Anyone interested in understanding how computers work at a fundamental level, including non-programmers and beginners.</p>



<div class="wp-block-kadence-advancedbtn kb-buttons-wrap kb-btns3639_7b7597-3e"><a class="kb-button kt-button button kb-btn3639_294063-2c kt-btn-size-standard kt-btn-width-type-full kb-btn-global-outline  kt-btn-has-text-true kt-btn-has-svg-true  wp-block-kadence-singlebtn" href="https://www.amazon.com/Code-Language-Computer-Hardware-Software/dp/0137909101" target="_blank" rel="noopener"><span class="kt-btn-inner-text">Check Price on Amazon</span><span class="kb-svg-icon-wrap kb-svg-icon-fas_arrow-right kt-btn-icon-side-right"><svg viewBox="0 0 448 512"  fill="currentColor" xmlns="http://www.w3.org/2000/svg"  aria-hidden="true"><path d="M190.5 66.9l22.2-22.2c9.4-9.4 24.6-9.4 33.9 0L441 239c9.4 9.4 9.4 24.6 0 33.9L246.6 467.3c-9.4 9.4-24.6 9.4-33.9 0l-22.2-22.2c-9.5-9.5-9.3-25 .4-34.3L311.4 296H24c-13.3 0-24-10.7-24-24v-32c0-13.3 10.7-24 24-24h287.4L190.9 101.2c-9.8-9.3-10-24.8-.4-34.3z"/></svg></span></a></div>
</div></div>

</div></div></div></div>

</div></div>


<p>&#8220;Code: The Hidden Language of Computer Hardware and Software&#8221; is an intriguing exploration that&#8217;ll demystify the underlying principles of how computers work. This book is your guide, taking you on an enlightening journey. Here, you&#8217;ll learn the fundamental concepts of computer science. This book covers everything from binary code and logic gates to higher-level programming languages.</p>



<p>You&#8217;ll appreciate the author&#8217;s ability to make complex topics accessible. You may not be a tech guru, but after reading this, you&#8217;ll have a robust understanding of what makes your computer tick. This is one of the best books for beginners.</p>



<h4 class="wp-block-heading">Key Benefits</h4>



<ul class="wp-block-list">
<li>Comprehensive understanding of computer science basics</li>



<li>Deeper appreciation for the complexity of computing devices</li>



<li>Insightful knowledge that could boost your coding skills</li>
</ul>



<h4 class="wp-block-heading">Pros</h4>



<ul class="wp-block-list">
<li>Detailed yet easy-to-understand explanations</li>



<li>Breaks down complex topics into digestible parts</li>



<li>Excellent for beginners and experts alike</li>
</ul>



<h4 class="wp-block-heading">Cons</h4>



<ul class="wp-block-list">
<li>Might be too basic for seasoned programmers</li>



<li>Some might find the pace slow</li>
</ul>



<div class="wp-block-kadence-advancedbtn kb-buttons-wrap kb-btns3639_9144d3-2d"><a class="kb-button kt-button button kb-btn3639_1db894-ed kt-btn-size-standard kt-btn-width-type-full kb-btn-global-outline  kt-btn-has-text-true kt-btn-has-svg-true  wp-block-kadence-singlebtn" href="https://www.amazon.com/Code-Language-Computer-Hardware-Software/dp/0137909101" target="_blank" rel="noopener"><span class="kt-btn-inner-text">Check Price on Amazon</span><span class="kb-svg-icon-wrap kb-svg-icon-fas_arrow-right kt-btn-icon-side-right"><svg viewBox="0 0 448 512"  fill="currentColor" xmlns="http://www.w3.org/2000/svg"  aria-hidden="true"><path d="M190.5 66.9l22.2-22.2c9.4-9.4 24.6-9.4 33.9 0L441 239c9.4 9.4 9.4 24.6 0 33.9L246.6 467.3c-9.4 9.4-24.6 9.4-33.9 0l-22.2-22.2c-9.5-9.5-9.3-25 .4-34.3L311.4 296H24c-13.3 0-24-10.7-24-24v-32c0-13.3 10.7-24 24-24h287.4L190.9 101.2c-9.8-9.3-10-24.8-.4-34.3z"/></svg></span></a></div>



<h3 class="wp-block-heading" id="continuous-delivery-reliable-software-releases-through-build-test-and-deployment-automation">12. Continuous Delivery: Reliable Software Releases through Build, Test, and Deployment Automation</h3>


<div class="kb-row-layout-wrap kb-row-layout-id3639_55521b-31 alignnone wp-block-kadence-rowlayout"><div class="kt-row-column-wrap kt-has-1-columns kt-row-layout-equal kt-tab-layout-inherit kt-mobile-layout-row kt-row-valign-top">

<div class="wp-block-kadence-column kadence-column3639_3ce7d3-aa kb-section-dir-vertical inner-column-1"><div class="kt-inside-inner-col"><div class="kb-row-layout-wrap kb-row-layout-id3639_2b4589-5c alignnone wp-block-kadence-rowlayout"><div class="kt-row-column-wrap kt-has-2-columns kt-row-layout-right-golden kt-tab-layout-inherit kt-mobile-layout-row kt-row-valign-top">

<div class="wp-block-kadence-column kadence-column3639_177508-3c kb-section-dir-vertical inner-column-1"><div class="kt-inside-inner-col">
<div class="wp-block-kadence-image kb-image3639_2ddca1-5d"><figure class="aligncenter"><img loading="lazy" decoding="async" width="800" height="1055" src="https://eranstiller.com/wp-content/uploads/2023/09/Continuous-Delivery-Reliable-Software-Releases-through-Build-Test-and-Deployment-Automation-Cover.jpg" alt="Book cover of &quot;Continuous Delivery: Reliable Software Releases through Build, Test, and Deployment Automation&quot;" class="kb-img wp-image-3679" srcset="https://eranstiller.com/wp-content/uploads/2023/09/Continuous-Delivery-Reliable-Software-Releases-through-Build-Test-and-Deployment-Automation-Cover.jpg 800w, https://eranstiller.com/wp-content/uploads/2023/09/Continuous-Delivery-Reliable-Software-Releases-through-Build-Test-and-Deployment-Automation-Cover-227x300.jpg 227w, https://eranstiller.com/wp-content/uploads/2023/09/Continuous-Delivery-Reliable-Software-Releases-through-Build-Test-and-Deployment-Automation-Cover-776x1024.jpg 776w, https://eranstiller.com/wp-content/uploads/2023/09/Continuous-Delivery-Reliable-Software-Releases-through-Build-Test-and-Deployment-Automation-Cover-768x1013.jpg 768w" sizes="auto, (max-width: 800px) 100vw, 800px" /></figure></div>
</div></div>



<div class="wp-block-kadence-column kadence-column3639_47581f-68 inner-column-2"><div class="kt-inside-inner-col">
<p><strong>Authors</strong>: Jez Humble and David Farley<br><strong>Publisher</strong>: Addison-Wesley<br><strong>Latest Edition</strong>: 1st edition<br><strong>Publication Year</strong>: 2010<br><strong>Number of Pages</strong>: 512<br><strong>Target Audience</strong>: Software engineers, managers, and architects looking to establish a robust software delivery process.</p>



<div class="wp-block-kadence-advancedbtn kb-buttons-wrap kb-btns3639_37f4dd-bf"><a class="kb-button kt-button button kb-btn3639_91fe99-91 kt-btn-size-standard kt-btn-width-type-full kb-btn-global-outline  kt-btn-has-text-true kt-btn-has-svg-true  wp-block-kadence-singlebtn" href="https://www.amazon.com/Continuous-Delivery-Deployment-Automation-Addison-Wesley/dp/0321601912" target="_blank" rel="noopener"><span class="kt-btn-inner-text">Check Price on Amazon</span><span class="kb-svg-icon-wrap kb-svg-icon-fas_arrow-right kt-btn-icon-side-right"><svg viewBox="0 0 448 512"  fill="currentColor" xmlns="http://www.w3.org/2000/svg"  aria-hidden="true"><path d="M190.5 66.9l22.2-22.2c9.4-9.4 24.6-9.4 33.9 0L441 239c9.4 9.4 9.4 24.6 0 33.9L246.6 467.3c-9.4 9.4-24.6 9.4-33.9 0l-22.2-22.2c-9.5-9.5-9.3-25 .4-34.3L311.4 296H24c-13.3 0-24-10.7-24-24v-32c0-13.3 10.7-24 24-24h287.4L190.9 101.2c-9.8-9.3-10-24.8-.4-34.3z"/></svg></span></a></div>
</div></div>

</div></div></div></div>

</div></div>


<p>In &#8220;Continuous Delivery: Reliable Software Releases through Build, Test, and Deployment Automation,&#8221; you&#8217;re introduced to automating delivery processes to ensure reliable and consistent updates. The authors, Jez Humble and David Farley guide you through a transformative approach to&nbsp;software development, where you&#8217;re encouraged to automate the build, deployment, and testing processes.</p>



<p>Despite some repetition and outdated parts, the practical insights gained from this book are invaluable. It thoroughly explains the stages of the continuous delivery pipeline &#8211; commit, acceptance, capacity, manual, and production &#8211; and dives deep into advanced topics such as infrastructure management and version control.</p>



<h4 class="wp-block-heading">Key Benefits</h4>



<ul class="wp-block-list">
<li>Reduction in software delivery risk</li>



<li>Increased efficiency in the development process</li>



<li>Quick response to user needs</li>
</ul>



<h4 class="wp-block-heading">Pros</h4>



<ul class="wp-block-list">
<li>Practical insights</li>



<li>Detailed explanations</li>



<li>Influential and essential in the field</li>
</ul>



<h4 class="wp-block-heading">Cons</h4>



<ul class="wp-block-list">
<li>Some outdated parts</li>



<li>Occasional repetition</li>
</ul>



<div class="wp-block-kadence-advancedbtn kb-buttons-wrap kb-btns3639_1660c2-ac"><a class="kb-button kt-button button kb-btn3639_e581f4-e2 kt-btn-size-standard kt-btn-width-type-full kb-btn-global-outline  kt-btn-has-text-true kt-btn-has-svg-true  wp-block-kadence-singlebtn" href="https://www.amazon.com/Continuous-Delivery-Deployment-Automation-Addison-Wesley/dp/0321601912" target="_blank" rel="noopener"><span class="kt-btn-inner-text">Check Price on Amazon</span><span class="kb-svg-icon-wrap kb-svg-icon-fas_arrow-right kt-btn-icon-side-right"><svg viewBox="0 0 448 512"  fill="currentColor" xmlns="http://www.w3.org/2000/svg"  aria-hidden="true"><path d="M190.5 66.9l22.2-22.2c9.4-9.4 24.6-9.4 33.9 0L441 239c9.4 9.4 9.4 24.6 0 33.9L246.6 467.3c-9.4 9.4-24.6 9.4-33.9 0l-22.2-22.2c-9.5-9.5-9.3-25 .4-34.3L311.4 296H24c-13.3 0-24-10.7-24-24v-32c0-13.3 10.7-24 24-24h287.4L190.9 101.2c-9.8-9.3-10-24.8-.4-34.3z"/></svg></span></a></div>



<h3 class="wp-block-heading" id="test-driven-development-by-example">13. Test-Driven Development: By Example</h3>


<div class="kb-row-layout-wrap kb-row-layout-id3639_9ded27-a1 alignnone wp-block-kadence-rowlayout"><div class="kt-row-column-wrap kt-has-1-columns kt-row-layout-equal kt-tab-layout-inherit kt-mobile-layout-row kt-row-valign-top">

<div class="wp-block-kadence-column kadence-column3639_325d09-47 kb-section-dir-vertical inner-column-1"><div class="kt-inside-inner-col"><div class="kb-row-layout-wrap kb-row-layout-id3639_5175e8-75 alignnone wp-block-kadence-rowlayout"><div class="kt-row-column-wrap kt-has-2-columns kt-row-layout-right-golden kt-tab-layout-inherit kt-mobile-layout-row kt-row-valign-top">

<div class="wp-block-kadence-column kadence-column3639_427564-59 kb-section-dir-vertical inner-column-1"><div class="kt-inside-inner-col">
<div class="wp-block-kadence-image kb-image3639_b765cb-f3"><figure class="aligncenter"><img loading="lazy" decoding="async" width="798" height="1000" src="https://eranstiller.com/wp-content/uploads/2023/09/Test-Driven-Development-By-Example-Cover.jpg" alt="Book cover of &quot;Test-Driven Development: By Example&quot;" class="kb-img wp-image-3680" srcset="https://eranstiller.com/wp-content/uploads/2023/09/Test-Driven-Development-By-Example-Cover.jpg 798w, https://eranstiller.com/wp-content/uploads/2023/09/Test-Driven-Development-By-Example-Cover-239x300.jpg 239w, https://eranstiller.com/wp-content/uploads/2023/09/Test-Driven-Development-By-Example-Cover-768x962.jpg 768w" sizes="auto, (max-width: 798px) 100vw, 798px" /></figure></div>
</div></div>



<div class="wp-block-kadence-column kadence-column3639_390a8e-3d inner-column-2"><div class="kt-inside-inner-col">
<p><strong>Author</strong>: Kent Beck<br><strong>Publisher</strong>: Addison-Wesley<br><strong>Latest Edition</strong>: 1st edition<br><strong>Publication Year</strong>: 2002<br><strong>Number of Pages</strong>: 240<br><strong>Target Audience</strong>: Software engineers interested in learning the fundamentals and practical applications of test-driven development.</p>



<div class="wp-block-kadence-advancedbtn kb-buttons-wrap kb-btns3639_19dcc9-ef"><a class="kb-button kt-button button kb-btn3639_72aedb-a3 kt-btn-size-standard kt-btn-width-type-full kb-btn-global-outline  kt-btn-has-text-true kt-btn-has-svg-true  wp-block-kadence-singlebtn" href="https://www.amazon.com/Continuous-Delivery-Deployment-Automation-Addison-Wesley/dp/0321601912" target="_blank" rel="noopener"><span class="kt-btn-inner-text">Check Price on Amazon</span><span class="kb-svg-icon-wrap kb-svg-icon-fas_arrow-right kt-btn-icon-side-right"><svg viewBox="0 0 448 512"  fill="currentColor" xmlns="http://www.w3.org/2000/svg"  aria-hidden="true"><path d="M190.5 66.9l22.2-22.2c9.4-9.4 24.6-9.4 33.9 0L441 239c9.4 9.4 9.4 24.6 0 33.9L246.6 467.3c-9.4 9.4-24.6 9.4-33.9 0l-22.2-22.2c-9.5-9.5-9.3-25 .4-34.3L311.4 296H24c-13.3 0-24-10.7-24-24v-32c0-13.3 10.7-24 24-24h287.4L190.9 101.2c-9.8-9.3-10-24.8-.4-34.3z"/></svg></span></a></div>
</div></div>

</div></div></div></div>

</div></div>


<p>&#8220;Test-Driven Development: By Example&#8221; is a software development book showing how writing tests before code can transform your development process. This approach, known as Test-Driven Development (TDD), is a valuable technique for minimizing bugs, improving code quality, and speeding up the development cycle.</p>



<p>You&#8217;ll learn how to write tests that define what your code should do, then write the code to pass those tests &#8211; a radical shift from traditional coding practices. This practical guide gives you real-world examples that demonstrate the power of TDD and how it can be applied in different scenarios.</p>



<h4 class="wp-block-heading">Key Benefits</h4>



<ul class="wp-block-list">
<li>Minimizes bugs and improves code quality</li>



<li>Speeds up the development cycle</li>



<li>Promotes better understanding of the codebase</li>
</ul>



<h4 class="wp-block-heading">Pros</h4>



<ul class="wp-block-list">
<li>Enhances code readability and maintenance</li>



<li>Encourages simple designs and inspires confidence</li>
</ul>



<h4 class="wp-block-heading">Cons</h4>



<ul class="wp-block-list">
<li>Requires a paradigm shift and disciplined approach</li>



<li>Initial development can be slower</li>
</ul>



<div class="wp-block-kadence-advancedbtn kb-buttons-wrap kb-btns3639_0c0e1c-a5"><a class="kb-button kt-button button kb-btn3639_0c6d8f-69 kt-btn-size-standard kt-btn-width-type-full kb-btn-global-outline  kt-btn-has-text-true kt-btn-has-svg-true  wp-block-kadence-singlebtn" href="https://www.amazon.com/Continuous-Delivery-Deployment-Automation-Addison-Wesley/dp/0321601912" target="_blank" rel="noopener"><span class="kt-btn-inner-text">Check Price on Amazon</span><span class="kb-svg-icon-wrap kb-svg-icon-fas_arrow-right kt-btn-icon-side-right"><svg viewBox="0 0 448 512"  fill="currentColor" xmlns="http://www.w3.org/2000/svg"  aria-hidden="true"><path d="M190.5 66.9l22.2-22.2c9.4-9.4 24.6-9.4 33.9 0L441 239c9.4 9.4 9.4 24.6 0 33.9L246.6 467.3c-9.4 9.4-24.6 9.4-33.9 0l-22.2-22.2c-9.5-9.5-9.3-25 .4-34.3L311.4 296H24c-13.3 0-24-10.7-24-24v-32c0-13.3 10.7-24 24-24h287.4L190.9 101.2c-9.8-9.3-10-24.8-.4-34.3z"/></svg></span></a></div>



<h2 class="wp-block-heading" id="what-is-software-engineering">What Are Software Engineering Books?</h2>



<figure class="wp-block-kadence-image kb-image3639_e13c10-72 size-large"><a href="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineering-Books-What-Are-Software-Engineering-Books.png" class="kb-advanced-image-link"><img loading="lazy" decoding="async" width="1024" height="574" src="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineering-Books-What-Are-Software-Engineering-Books-1024x574.png" alt="A stack of books next to a laptop in a library." class="kb-img wp-image-3646" srcset="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineering-Books-What-Are-Software-Engineering-Books-1024x574.png 1024w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineering-Books-What-Are-Software-Engineering-Books-300x168.png 300w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineering-Books-What-Are-Software-Engineering-Books-768x430.png 768w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineering-Books-What-Are-Software-Engineering-Books.png 1456w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>Software engineering textbooks are critical resources designed to deepen your understanding and hone your skills in the ever-evolving field of software development. These books cover various topics, including programming languages, software design patterns, system architecture, project management, and DevOps practices.</p>



<p>Leveraging these resources, you can enrich your knowledge with industry best practices and foster innovation and efficiency in your projects. These texts can offer a rich knowledge base, allowing you to improve as a software engineer and upgrade your career.</p>



<p>Delving into such books can enhance your problem-solving skills, enabling you to approach complex challenges with a seasoned perspective. It&#8217;s a good practice to choose books that not only align with your current project requirements but also help broaden your overall understanding of the intricate world of software engineering.</p>



<h2 class="wp-block-heading" id="how-can-software-engineering-books-benefit-you-">How Can Software Engineering Books Benefit You?</h2>



<figure class="wp-block-kadence-image kb-image3639_2006dd-ae size-large"><a href="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineering-Books-Benefits.png" class="kb-advanced-image-link"><img loading="lazy" decoding="async" width="1024" height="574" src="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineering-Books-Benefits-1024x574.png" alt="A stack of books arranged in a library with a lightbulb symbolizing enlightenment floating above them." class="kb-img wp-image-3648" srcset="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineering-Books-Benefits-1024x574.png 1024w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineering-Books-Benefits-300x168.png 300w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineering-Books-Benefits-768x430.png 768w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineering-Books-Benefits.png 1456w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>You&#8217;ll find that a good read can significantly enhance your understanding and practical skills in this field. Software engineering books&nbsp;provide comprehensive knowledge that&#8217;s accessible even to non-techies. They break down complex concepts into digestible chunks, helping you understand the foundations of software development.</p>



<p>But how can books for software engineering benefit you? First, they offer a structured learning path. Instead of randomly searching for information online, these books systematically guide you through essential topics.</p>



<p>Second, the best books for software engineering&nbsp;provide real-world examples that make learning more practical and understandable. You&#8217;re not just absorbing theoretical knowledge but learning how to apply it.</p>



<p>Moreover, the benefits of reading software engineering books extend beyond immediate skill acquisition. They help you stay updated with the latest industry trends, methodologies, and&nbsp;best practices. This is crucial in a rapidly evolving field like software engineering.</p>



<p>Whether you&#8217;re a novice or a seasoned professional, the best books on software engineering can empower you with in-depth knowledge and a fresh perspective. So, pick up a book and start enriching your software engineering journey today.</p>



<h2 class="wp-block-heading" id="conclusion">Conclusion</h2>



<p>I hope you&#8217;ve seen the value of software engineering and how its books can benefit you. These resources will not only boost your technical knowledge but also provide practical examples for real-world application.</p>



<p>Don&#8217;t hesitate to dive into these top software engineering books in 2023. They&#8217;ll equip you to stay ahead of the curve in this rapidly evolving field.</p>



<p>Remember, continuous learning is the key to success in software engineering. They are your gateway to upskilling yourself and advancing your career. What are you waiting for? Start reading your next book today.</p>
<p>The post <a rel="nofollow" href="https://eranstiller.com/software-engineering-books">13 Best Software Engineering Books To Read In 2023</a> appeared first on <a rel="nofollow" href="https://eranstiller.com">Eran Stiller</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://eranstiller.com/software-engineering-books/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>76 Best Software Engineer Skills to Learn in 2023: Level Up Your Career</title>
		<link>https://eranstiller.com/software-engineer-skills</link>
					<comments>https://eranstiller.com/software-engineer-skills#respond</comments>
		
		<dc:creator><![CDATA[Eran Stiller]]></dc:creator>
		<pubDate>Sun, 03 Sep 2023 23:03:17 +0000</pubDate>
				<category><![CDATA[Software Development]]></category>
		<guid isPermaLink="false">https://eranstiller.com/?p=3582</guid>

					<description><![CDATA[<p>Are you a budding software engineer eager to make your mark, or perhaps a veteran looking to elevate your career to unprecedented heights? In the ever-evolving tech landscape, standing still is not an option. With over two decades of firsthand experience climbing the ranks from a fresh university graduate to holding esteemed positions such as...</p>
<p>The post <a rel="nofollow" href="https://eranstiller.com/software-engineer-skills">76 Best Software Engineer Skills to Learn in 2023: Level Up Your Career</a> appeared first on <a rel="nofollow" href="https://eranstiller.com">Eran Stiller</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Are you a budding software engineer eager to make your mark, or perhaps a veteran looking to elevate your career to unprecedented heights? In the ever-evolving tech landscape, standing still is not an option.</p>



<p>With over two decades of firsthand experience climbing the ranks from a fresh university graduate to holding esteemed positions such as Chief Software Architect and CTO, I know how fast our industry evolves. Moving forward and staying at the top is more challenging than ever before.</p>



<p>Imagine yourself being fully equipped with top software engineer skills, a tailored toolkit designed not just to meet the demands of the present but to catapult you into the future.</p>



<p>That&#8217;s why I&#8217;ve curated this list. It lists the top software engineering skills needed to level up your career. We&#8217;ll dive into technical and soft skills so you can choose the right mix for your desired career path and personal strengths and weaknesses.</p>



<p>If you&#8217;re looking to kickstart a successful career in software engineering or take on a more senior role, this guide is essential for achieving your goals. It will help you stay up-to-date with the latest industry trends while also enabling you to drive progress in your career.</p>



<p>Take the time to explore this comprehensive guide and take the next step toward achieving your ambitions!</p>


<div class="kb-row-layout-wrap kb-row-layout-id3582_c63204-e8 alignnone wp-block-kadence-rowlayout"><div class="kt-row-column-wrap kt-has-1-columns kt-row-layout-equal kt-tab-layout-inherit kt-mobile-layout-row kt-row-valign-top">

<div class="wp-block-kadence-column kadence-column3582_1c4cd8-8c inner-column-1"><div class="kt-inside-inner-col">
<h2 class="wp-block-heading">Key Takeaways</h2>



<ul class="wp-block-list">
<li>Core software development skills are essential, including a strong understanding of programming languages, data structures, algorithms, problem-solving, and software testing.</li>



<li>Web, mobile, and application development require proficiency in various programming languages, problem-solving skills for debugging and improving software systems, and a willingness to learn new skills for career growth.</li>



<li>Infrastructure, systems, and DevOps skills involve effective communication, mastery of software testing and debugging, prioritizing effective solutions, collaboration, and strategic thinking.</li>



<li>Data management, analysis, and AI skills include organizing and interpreting large amounts of data, using SQL and Python for data management and analysis, applying AI solutions to real-world problems, and creating efficient software solutions using data.</li>



<li>Soft skills can be a game changer in your career&#8217;s trajectory, as communication is vital to various aspects of a software engineering career. It&#8217;s all about listening, understanding, and conveying ideas effectively.</li>
</ul>
</div></div>

</div></div>




<h2 class="wp-block-heading">What Are the Top Software Engineering Skills to Learn in 2023?</h2>



<p>In today&#8217;s tech-driven world, mastering specific software engineering skills can significantly level up your career.</p>



<p>While the core principles remain consistent, the tools, languages, frameworks, and paradigms shift and transform as technology progresses. Every year, new trends emerge, and some fade away.</p>



<p>Today, the spectrum of abilities required of a software engineer is more diverse than ever, covering everything from fundamental programming concepts to personal branding. Whether you&#8217;re a budding developer, a seasoned engineer, or somewhere in between, leveling up in these areas will undeniably propel your career to new heights.</p>



<p>Dive in and explore what the future holds for you.</p>



<h3 class="wp-block-heading">1. Fundamental Programming Concepts</h3>



<figure class="wp-block-image size-large"><a href="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Fundemental-Programming-Concepts.png"><img loading="lazy" decoding="async" width="1024" height="574" src="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Fundemental-Programming-Concepts-1024x574.png" alt="A surreal landscape that serves as an allegory for programming fundamentals." class="wp-image-3589" srcset="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Fundemental-Programming-Concepts-1024x574.png 1024w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Fundemental-Programming-Concepts-300x168.png 300w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Fundemental-Programming-Concepts-768x430.png 768w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Fundemental-Programming-Concepts.png 1456w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>Mastering fundamental programming concepts is essential. It&#8217;s the building block of any successful software engineering career. I&#8217;ve found that understanding the basics of a programming language sets the foundation for more complex problem-solving. Variables, data types, control structures, syntax, and semantics are some of the core concepts that every programmer should know.</p>



<p>The ability to read and write code is just the beginning. I&#8217;ve learned that knowing how to debug, test, and maintain code is just as crucial. I&#8217;ve also found that understanding data structures and algorithms helps write efficient code.</p>



<p>Mastering these fundamental concepts has helped me adapt to different programming languages quickly. It enhanced my problem-solving skills and made me a better software developer.</p>



<h3 class="wp-block-heading">2. Data Structures</h3>



<p><a href="https://en.wikipedia.org/wiki/Data_structure" target="_blank" data-type="link" data-id="https://en.wikipedia.org/wiki/Data_structure" rel="noreferrer noopener">Data structures</a> aren&#8217;t just about storing data; they&#8217;re also about organizing and managing it in a way that&#8217;s efficient and easy to understand. Understanding data structures is one of the hard skills required for a software developer.</p>



<p>Data structures facilitate efficient problem-solving within software systems. They&#8217;re crucial in software development, particularly in complex, multi-layered systems. Arrays, Lists, Stacks, Queues, Trees, Graphs, Hash Maps, Sets, and Linked Lists &#8211; A career in software development demands a solid grasp of these structures.</p>



<p>Software engineers must understand and apply data structures effectively, from open-source software to proprietary systems. It&#8217;s one of the technical skills needed to excel in a software development career.</p>



<h3 class="wp-block-heading">3. Algorithm Design &amp; Analysis</h3>



<p>As a software developer, <a href="https://www.geeksforgeeks.org/design-and-analysis-of-algorithms/" target="_blank" data-type="link" data-id="https://www.geeksforgeeks.org/design-and-analysis-of-algorithms/" rel="noreferrer noopener">algorithm design and analysis</a> is another important skill I must focus on. This core skill allows me to create efficient, reliable software.</p>



<p>Knowing your algorithms well can also significantly help in job interviews, where algorithm-type questions are often key screening factors. Sorting algorithms, search algorithms, recursion, and divide and conquer &#8211; these are all areas you should brush up on.</p>



<p>This skill is an absolute must for any aspiring software developer.</p>



<h3 class="wp-block-heading">4. Object-Oriented Design</h3>



<p>In programming, there&#8217;s nothing quite like <a href="https://en.wikipedia.org/wiki/Object-oriented_design" target="_blank" rel="noreferrer noopener">object-oriented design</a> for organizing complex systems. This approach is about structuring software as a collection of objects, each encapsulating data and the procedures that act on this data.</p>



<p>I&#8217;ve found that it&#8217;s an essential skill for any software engineer, aiding in creating scalable, maintainable code that can quickly adapt to changing requirements. It&#8217;s not just about grasping the four fundamental principles of object-oriented design: encapsulation, inheritance, polymorphism, and abstraction. It&#8217;s also about knowing when and how to apply them effectively.</p>



<p>Mastering object-oriented design means I can build software that&#8217;s not only functional but also efficient, robust, and easy to understand. This skill is undeniably a must-have for leveling up your career.</p>



<h3 class="wp-block-heading">5. Functional Programming</h3>



<p>You&#8217;ll find that mastering <a href="https://en.wikipedia.org/wiki/Functional_programming" target="_blank" data-type="link" data-id="https://en.wikipedia.org/wiki/Functional_programming" rel="noreferrer noopener">functional programming</a> can be a game changer. It&#8217;s a paradigm that treats computation as evaluating mathematical functions and avoids changing-state and mutable data. This approach leads to more accessible code to understand, test, and debug.</p>



<p>By embracing functional programming, you&#8217;re adding a vital tool to your programming skills arsenal. It&#8217;s not just about writing code but doing so in an efficient, scalable way and reducing potential errors.</p>



<p>Not only does it enhance your programming skills, but it also gives you an edge in the ever-competitive tech industry.</p>



<h3 class="wp-block-heading">6. Scripting Languages</h3>



<figure class="wp-block-image size-large"><a href="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Scripting-Languages.png"><img loading="lazy" decoding="async" width="1024" height="574" src="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Scripting-Languages-1024x574.png" alt="An illustration image of an open-space settings where a programmer would work with scripting languages." class="wp-image-3590" srcset="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Scripting-Languages-1024x574.png 1024w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Scripting-Languages-300x168.png 300w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Scripting-Languages-768x430.png 768w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Scripting-Languages.png 1456w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>Mastering <a href="https://en.wikipedia.org/wiki/Scripting_language" target="_blank" rel="noreferrer noopener">scripting languages</a> like Bash, Python, or JavaScript can significantly ease your daily tasks, as they&#8217;re designed to automate the execution of tasks, which could be executed one by one by a human operator.</p>



<p>Python is particularly noted for its readability and simplicity, making it a great introduction to programming. It&#8217;s often used for web development, data analysis, AI, and more.</p>



<p>Conversely, JavaScript is the backbone of modern web applications, enabling interactivity and complex functionalities. It&#8217;s also versatile, being used for both frontend and backend development.</p>



<p>Bash is the tool of choice for Linux programming and automation. No DevOps or CI/CD pipeline is complete without a mean-looking bash script that automates something that would take ages to perform manually.</p>



<p>Ultimately, these scripting languages are indispensable skills for a software engineer.</p>



<h3 class="wp-block-heading">7. Compiled Languages</h3>



<p>Proficiency in <a href="https://en.wikipedia.org/wiki/Compiled_language" target="_blank" data-type="link" data-id="https://en.wikipedia.org/wiki/Compiled_language" rel="noreferrer noopener">compiled languages</a> is a must-have. Unlike scripting languages, interpreted at runtime, compiled languages are converted into machine code before execution. This feature makes them faster and more efficient. They&#8217;re also strongly typed, which can help catch errors at compile time rather than runtime.</p>



<p>Some well-known compiled languages include C++, Java, C#, and Rust. Mastering them will improve your ability to write efficient, error-free code.</p>



<p>In short, leveraging the power of compiled languages can significantly boost your software development skills and, in turn, your career.</p>



<h3 class="wp-block-heading">8. Declarative Languages</h3>



<p>In contrast to <a href="https://en.wikipedia.org/wiki/Imperative_programming" target="_blank" rel="noreferrer noopener">imperative languages</a>, which require step-by-step procedures, <a href="https://en.wikipedia.org/wiki/Declarative_programming" target="_blank" rel="noopener">declarative</a> ones are about describing the desired result. This makes them a good fit for database querying, for example, where you want to specify what data you need, not how to fetch it.</p>



<p>Software programs written in declarative languages, like SQL or specially crafted DSLs, are easier to understand and debug since they express logic without unnecessary details. They&#8217;re also highly efficient for parallel computing, as they eliminate side effects.</p>



<p>However, their abstraction can make them less flexible for specific tasks. Mastering declarative and imperative languages could sometimes give you the extra edge you need to develop software efficiently.</p>



<h3 class="wp-block-heading">9. Version Control</h3>



<p>In today&#8217;s tech world, having a good grasp of <a href="https://www.atlassian.com/git/tutorials/what-is-version-control" target="_blank" rel="noreferrer noopener">version control</a> is essential. It&#8217;s a crucial part of my technical skills and a vital tool for any software engineer.</p>



<p>Version control systems like <a href="https://www.atlassian.com/git/tutorials/what-is-git" target="_blank" rel="noreferrer noopener">Git</a> allow you to track and manage changes to your code, facilitating collaboration and preventing data loss. You can revert to previous versions, compare differences, and isolate issues.</p>



<p>It&#8217;s not just about keeping a history of your modifications &#8211; it&#8217;s about understanding the evolution of your project, maintaining a smooth software development process, and efficient collaboration with your peers.</p>



<p>It&#8217;s clear that mastering version control isn&#8217;t optional; it&#8217;s a necessity. A thorough understanding of version control is a significant asset in your software engineering career.</p>



<h3 class="wp-block-heading">10. Build Tools</h3>



<figure class="wp-block-image size-large"><a href="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Build-Tools.png"><img loading="lazy" decoding="async" width="1024" height="574" src="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Build-Tools-1024x574.png" alt="An illustration image showing a skyscraper built by various build tools." class="wp-image-3592" srcset="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Build-Tools-1024x574.png 1024w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Build-Tools-300x168.png 300w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Build-Tools-768x430.png 768w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Build-Tools.png 1456w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>Build tools are instrumental in automating routine tasks, compiling source code into executable code, and managing dependencies. They&#8217;re essential for any software development project, ensuring the code&#8217;s stability and improving the efficiency of the development process.</p>



<p>Mastering tools like <a href="https://gradle.org/" target="_blank" rel="noreferrer noopener">Gradle</a>, <a href="https://maven.apache.org/" target="_blank" rel="noreferrer noopener">Maven</a>, and <a href="https://ant.apache.org/" target="_blank" rel="noreferrer noopener">Ant</a> can drastically streamline the build process. They&#8217;re not just about compiling the code; they also manage libraries and dependencies, run automated tests, and generate documentation. These tools help you organize your project, reduce bugs, and deliver a better final product.</p>



<p>I&#8217;ve learned that efficiently using build tools can significantly improve my productivity, making them an essential skill for any software engineer.</p>



<h3 class="wp-block-heading">11. Continuous Integration &amp; Continuous Delivery (CI/CD)</h3>



<p>Gone are the days of &#8220;It works on my machine&#8221; excuses or nightmare deployment weekends that everyone dreaded. With <a href="https://en.wikipedia.org/wiki/Continuous_integration" target="_blank" rel="noreferrer noopener">Continuous Integration</a> and <a href="https://en.wikipedia.org/wiki/Continuous_delivery" target="_blank" rel="noreferrer noopener">Continuous Delivery</a> (CI/CD), you&#8217;re automating the build and deployment process, catching issues early, and making deployments a non-event. It&#8217;s like having an extra set of eyes and hands that are tirelessly working to ensure that your code integrates seamlessly, tests are passing, and everything gets where it needs to go safely and efficiently.</p>



<p>Learning CI/CD makes you a more valuable asset to your team and gets you in sync with the DevOps culture, which is all about speed, automation, and reliability. Trust me, once you go CI/CD, there&#8217;s no turning back—it&#8217;s a career game-changer.</p>



<p>Understanding the principles of CI/CD is essential. It&#8217;ll allow you to frequently merge code changes, automate testing, and ensure that you can release updates faster and more reliably as you steer your software development project to completion.</p>



<h3 class="wp-block-heading">12. Unit Testing</h3>



<p><a href="https://en.wikipedia.org/wiki/Unit_testing" target="_blank" rel="noreferrer noopener">Unit testing</a> is an essential aspect of coding. It allows you to verify each part of your code individually to ensure it&#8217;s working correctly.</p>



<p>Unit testing is a component of software testing and debugging. It examines the most minor parts of a system, like functions or procedures, to ensure that they perform as expected. You can identify and fix bugs early in the development process by implementing unit tests. This saves time and resources later on.</p>



<p>Unit testing also provides a sort of documentation. It makes it easier for you and other engineers to understand the code.</p>



<p>Unit testing is a valuable tool in searching for high-quality, reliable software.</p>



<h3 class="wp-block-heading">13. Code Review Practices</h3>



<figure class="wp-block-image size-large"><a href="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Code-Review.png"><img loading="lazy" decoding="async" width="1024" height="574" src="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Code-Review-1024x574.png" alt="An illustration showing a group of software engineers reviewing a piece of code." class="wp-image-3593" srcset="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Code-Review-1024x574.png 1024w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Code-Review-300x168.png 300w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Code-Review-768x430.png 768w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Code-Review.png 1456w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>In today&#8217;s competitive tech industry, it&#8217;s vital to adopt effective <a href="https://about.gitlab.com/topics/version-control/what-is-code-review/" target="_blank" rel="noreferrer noopener">code review</a> practices to ensure the quality and efficiency of your work.</p>



<p>We all like to think we&#8217;re the Da Vinci of coding, churning out flawless art every time we hit that keyboard. But let&#8217;s be honest &#8211; mistakes happen.</p>



<p>And it&#8217;s not just about catching bugs. A solid code review is also about ensuring that the code aligns well with project architecture, follows coding standards, and is, for lack of a better word, &#8216;elegant.&#8217;</p>



<p>Remember, you&#8217;re not just writing code for machines to understand; your teammates must also get it. It&#8217;s about making sure that the code can be maintained and understood months, even years down the line. Code reviews allow us to learn from each other, share knowledge, and build a collective sense of ownership and accountability.</p>



<p>It&#8217;s professional growth, team building, and quality assurance all rolled into one. Make code reviews a habit, and you&#8217;ll be a better engineer and a cherished team member.</p>



<h3 class="wp-block-heading">14. Generative AI Tools</h3>



<p>Generative AI Tools are becoming a game-changer. Why? Because they&#8217;re reshaping how we approach problem-solving and product development. <a href="https://chat.openai.com/" data-type="link" data-id="https://chat.openai.com/" target="_blank" rel="noreferrer noopener">ChatGPT</a>, <a href="https://github.com/features/copilot" target="_blank" rel="noreferrer noopener">GitHub Copilot</a>, and <a href="https://bard.google.com/" target="_blank" rel="noreferrer noopener">Google Bard</a> are just a few of the rising stars in this area.</p>



<p>Imagine you&#8217;ve got a project that requires authoring a lot of boilerplate code. Instead of manually hammering out every detail, you can use Generative AI to automate a significant chunk of that work. These tools could save you hours, days, or even weeks of effort, allowing you to focus on the parts of the project that require your expertise.</p>



<p>And it&#8217;s not just about being efficient; it&#8217;s about being effective. With AI doing some of the heavy lifting, you can bring more innovative solutions, tackle complex problems, and deliver more value to your company.</p>



<p>Understanding the capabilities and limitations of Generative AI isn&#8217;t just a &#8220;nice-to-have&#8221; anymore; it&#8217;s quickly becoming a &#8220;must-have&#8221; skill for any forward-thinking software engineer.</p>



<h3 class="wp-block-heading">15. HTML, CSS &amp; JavaScript</h3>



<p>You might think <a href="https://www.freecodecamp.org/news/html-css-and-javascript-explained-for-beginners/" target="_blank" rel="noreferrer noopener">HTML, CSS, and JavaScript</a> are the &#8220;basics&#8221; you can overlook, especially if you&#8217;re diving into machine learning algorithms or setting up complex back-end services.</p>



<p>But let me tell you, they&#8217;re foundational for a reason. I&#8217;ve been in this industry for many years, and I&#8217;ve seen brilliant engineers stumble because they didn&#8217;t understand how their code materialized in a browser. It&#8217;s like being a master chef but not knowing how to set the table properly.</p>



<p>HTML is the structure of your digital world, CSS makes it look presentable, and JavaScript adds interactive magic. Whether you&#8217;re building full-fledged web applications, single-page apps, or even mobile apps with web-based views, these technologies come into play. And let&#8217;s not forget many emerging technologies like WebAssembly still lean on these foundational languages for interoperability.</p>



<p>So please don&#8217;t skip the basics; they&#8217;re your bread and butter in software development.</p>



<h3 class="wp-block-heading">16. Web Front-End Frameworks</h3>



<p>Diving deeper into web development, let&#8217;s focus on front-end frameworks. These tools help us streamline our code and build robust websites more efficiently. Mastering these frameworks is crucial for efficiency and productivity.</p>



<p>Some top front-end frameworks include <a href="https://react.dev/" target="_blank" rel="noreferrer noopener">React</a>, <a href="https://angular.io/" target="_blank" rel="noreferrer noopener">Angular</a>, and <a href="https://vuejs.org/" target="_blank" rel="noreferrer noopener">Vue.js</a>. React, developed by Facebook, is a JavaScript library for building user interfaces. Angular, on the other hand, is a TypeScript-based open-source framework developed by Google. Lastly, Vue.js is an open-source JavaScript framework for building user interfaces.</p>



<p>Each has strengths and weaknesses, and choosing the right one depends on the project requirements. Understanding these frameworks is critical to leveling up your career.</p>



<h3 class="wp-block-heading">17. Server Side Rendering (SSR)</h3>



<p>Having explored web front-end frameworks, it&#8217;s crucial to note another significant area in the web development realm: Server Side Rendering (SSR).</p>



<p>SSR is a technique that can improve a website&#8217;s performance and make it more SEO-friendly. It&#8217;s about rendering a client-side or universal app to a static HTML string on the server and then sending it to the client. This process speeds up the initial page load because the browser can display the HTML as soon as it&#8217;s received.</p>



<p>Mastering SSR enhances your web development prowess and gives you an edge in creating optimized, high-performance websites.</p>



<h3 class="wp-block-heading">18. Web Back-End Frameworks</h3>



<p>You&#8217;ll find that understanding web back-end frameworks can significantly enhance the functionality and efficiency of your websites. They provide a structured way to build and manage web applications, making handling HTTP requests and database operations easier.</p>



<p>Mastering these frameworks is crucial. They provide robust software solutions for end users, improving their overall experience. <a href="https://www.djangoproject.com/" target="_blank" rel="noreferrer noopener">Django</a>, <a href="https://expressjs.com/" target="_blank" rel="noreferrer noopener">Express</a>, and <a href="https://laravel.com/" target="_blank" rel="noreferrer noopener">Laravel</a> are some popular back-end frameworks. They offer built-in tools and libraries to streamline the development process.</p>



<p>These frameworks have significantly reduced my time and effort to build complex applications. I&#8217;m continually improving my skills and staying relevant in the ever-evolving tech industry by focusing on these.</p>



<h3 class="wp-block-heading">19. RESTful API Design</h3>



<figure class="wp-block-image size-large"><a href="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-RESTful-API-Design.png"><img loading="lazy" decoding="async" width="1024" height="574" src="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-RESTful-API-Design-1024x574.png" alt="An illustration of two computers communicating with each other." class="wp-image-3595" srcset="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-RESTful-API-Design-1024x574.png 1024w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-RESTful-API-Design-300x168.png 300w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-RESTful-API-Design-768x430.png 768w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-RESTful-API-Design.png 1456w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>In exploring <a href="https://learn.microsoft.com/en-us/azure/architecture/best-practices/api-design" target="_blank" rel="noreferrer noopener">RESTful API design</a>, you&#8217;ll find it&#8217;s a key component in developing interactive web applications that are scalable, efficient, and easy to maintain. It&#8217;s a set of rules that developers follow when creating APIs for their software applications.</p>



<p>The elegance of RESTful API lies in its simplicity; it uses HTTP methods explicitly and in a way consistent with the protocol definition. This standardization makes it easier for users to understand and use the API. It&#8217;s stateless, meaning each call can be made independently of others, increasing reliability and scalability.</p>



<h3 class="wp-block-heading">20. WebSockets</h3>



<p><a href="https://en.wikipedia.org/wiki/WebSocket" target="_blank" rel="noreferrer noopener">WebSockets</a> provide a persistent connection between a client and a server, allowing for real-time data flow. Understanding and leveraging this technology is crucial. With it, you can create interactive and dynamic experiences for users, something that&#8217;s increasingly in demand in today&#8217;s fast-paced digital world.</p>



<p>Comprehending the workings of WebSockets isn&#8217;t just about knowing how to establish a connection. It&#8217;s also about understanding how to handle messages, deal with errors, and close connections gracefully. It&#8217;s a tool with profound impacts on the efficiency and responsiveness of applications.</p>



<h3 class="wp-block-heading">21. WebAssembly (WASM)</h3>



<p><a href="https://webassembly.org/" target="_blank" rel="noreferrer noopener">WebAssembly</a>, often abbreviated as WASM, is a binary instruction format that allows you to run code at near-native speed in the web browser. This makes it a skill that&#8217;s becoming increasingly critical for software engineers.</p>



<p>WASM enables high-performance applications on web pages. It&#8217;s safe and efficient, making it a powerful tool for building faster, more efficient applications. Learning WASM will allow you to write code in multiple languages, not just JavaScript, broadening your coding horizons.</p>



<p>Adopting WASM by significant browsers like Chrome, Firefox, and Safari signals its importance. It&#8217;s a tool that can help programmers to build faster, more efficient applications.</p>



<h3 class="wp-block-heading">22. Android Development</h3>



<figure class="wp-block-kadence-image kb-image3582_ad1d5c-3b size-large"><a href="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Android-Development.png" class="kb-advanced-image-link"><img loading="lazy" decoding="async" width="1024" height="574" src="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Android-Development-1024x574.png" alt="An illustration of an Android phone device." class="kb-img wp-image-3598" srcset="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Android-Development-1024x574.png 1024w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Android-Development-300x168.png 300w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Android-Development-768x430.png 768w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Android-Development.png 1456w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>You&#8217;re sure to find <a href="https://developer.android.com/" target="_blank" rel="noreferrer noopener">Android development</a> an essential area of expertise, as it&#8217;s the most popular mobile operating system worldwide.</p>



<p>You&#8217;ll work with Java and Kotlin, the main languages for Android development. Understanding Android SDK and Android Studio, the official IDE for Android development, is crucial.</p>



<p>You&#8217;ll also need to master XML for UI layouts and SQLite for data storage. Knowledge of cross-platform tools like Flutter can be a bonus. A firm grasp of material design, the official Android design language, is also critical.</p>



<h3 class="wp-block-heading">23. iOS Development</h3>



<p><a href="https://developer.apple.com/tutorials/app-dev-training/" target="_blank" rel="noopener">iOS development</a> is all about creating apps for Apple&#8217;s iOS devices. You&#8217;ll need to get comfortable with Swift, Apple&#8217;s programming language, and Xcode, their integrated development environment. Understanding the iOS Human Interface Guidelines is also essential. It&#8217;ll allow you to create intuitive and user-friendly apps.</p>



<p>Additionally, you&#8217;ll need to master the Core Data framework for efficient data management. In today&#8217;s tech landscape, having proficiency in iOS development can significantly level up your career as a software engineer. So, it&#8217;s certainly a skill worth investing your time in.</p>



<h3 class="wp-block-heading">24. Cross-Platform UI Development</h3>



<p>Cross-platform UI development is where you&#8217;ll design user interfaces compatible with multiple operating systems. Here, mastering the skills for software like <a href="https://reactnative.dev/" target="_blank" rel="noreferrer noopener">React Native</a>, <a href="https://dotnet.microsoft.com/en-us/apps/xamarin" target="_blank" rel="noreferrer noopener">Xamarin</a>, and <a href="https://flutter.dev/" target="_blank" rel="noreferrer noopener">Flutter</a> is critical. These tools enable seamless UI creation, which functions efficiently across platforms.</p>



<p>A solid understanding of JavaScript is essential for React Native, while C# is pivotal for Xamarin. For Flutter, you&#8217;ll need to be proficient in Dart. Efficiency in coding and debugging, with a knack for creating intuitive, user-friendly interfaces, is crucial.</p>



<p>Additionally, understanding the nuances of different operating systems and devices is vital to ensure optimal UI performance. Cross-platform UI development is a valuable skill for a well-rounded software engineer.</p>



<h3 class="wp-block-heading">25. Structured Query Language (SQL)</h3>



<p>Diving into <a href="https://aws.amazon.com/what-is/sql/" target="_blank" rel="noopener">Structured Query Language</a> (SQL), it&#8217;s crucial to grasp its importance in managing and manipulating databases. This language is the backbone of many major systems, from web services to data warehouses. Unsurprisingly, SQL skills are the technical cornerstone for any aspiring software engineer.</p>



<p>Understanding SQL means you can create, modify, and extract data from a relational database, manage database structures, and design complex queries. It&#8217;s all about storing, retrieving, and manipulating data efficiently. Despite the advent of NoSQL databases, SQL&#8217;s relevance remains strong, as it&#8217;s universally used across the tech industry, even in some modern NoSQL databases.</p>



<h3 class="wp-block-heading">26. Relational Database Design</h3>



<figure class="wp-block-image size-large"><a href="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Relational-Database-Design.png"><img loading="lazy" decoding="async" width="1024" height="574" src="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Relational-Database-Design-1024x574.png" alt="An illustration of relational database components." class="wp-image-3596" srcset="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Relational-Database-Design-1024x574.png 1024w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Relational-Database-Design-300x168.png 300w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Relational-Database-Design-768x430.png 768w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Relational-Database-Design.png 1456w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>Having explored SQL, I can&#8217;t overstate its importance. Yet, it&#8217;s not just about querying data; understanding how it is structured is equally crucial. That&#8217;s where <a href="https://support.microsoft.com/en-gb/office/database-design-basics-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5" target="_blank" rel="noreferrer noopener">Relational Database Design</a> comes in.</p>



<p>Mastering the art of designing robust, scalable databases demands a strategic mindset, the ability to visualize complex structures, and keen attention to detail. You must predict potential issues before they occur, ensuring data integrity and efficient performance.</p>



<p>With data becoming even more central to our digital world, excelling in Relational Database Design will give any software engineer an edge. It&#8217;s a skill worth investing in.</p>



<h3 class="wp-block-heading">27. ACID vs. BASE Principles</h3>



<p>You&#8217;ll find that understanding the differences between <a href="https://en.wikipedia.org/wiki/ACID" target="_blank" rel="noreferrer noopener">ACID</a> and BASE principles can enhance your database design approach. ACID (Atomicity, Consistency, Isolation, Durability) principles ensure reliable transactions, especially in a multi-user environment. On the other hand, BASE (Basically Available, Soft state, <a href="https://en.wikipedia.org/wiki/Eventual_consistency" target="_blank" rel="noreferrer noopener">Eventually consistent</a>) principles prioritize availability and flexibility, sacrificing immediate consistency.</p>



<p>For high-volume, distributed systems, you&#8217;ll lean towards BASE. However, you&#8217;ll opt for ACID for systems requiring strong data integrity, like banks. Grasping these two principles will undoubtedly add depth to your software engineering expertise, allowing you to design robust database systems.</p>



<h3 class="wp-block-heading">28. NoSQL Databases</h3>



<p><a href="https://en.wikipedia.org/wiki/NoSQL" target="_blank" rel="noopener">NoSQL</a> databases are designed to handle semi-structured or unstructured data and are an excellent fit for applications requiring real-time data processing. I often work with these databases due to their flexibility and speed.</p>



<p>They&#8217;re not bound by the rigid schemas that traditional SQL databases have, which allows me to store diverse data types more efficiently. Software engineers typically work with vast amounts of unstructured data in today&#8217;s big data environment, and NoSQL databases are a game-changer. They support horizontal scaling, which is invaluable when dealing with large datasets.</p>



<p>Using NoSQL databases effectively can significantly enhance a software engineer&#8217;s skill set and open up new opportunities in the ever-evolving tech industry.</p>



<h3 class="wp-block-heading">29. Distributed Databases</h3>



<p>In the early days, a single database instance often did the trick. But as applications grow in complexity and user base, a monolithic database won&#8217;t cut it anymore. That&#8217;s where <a href="https://en.wikipedia.org/wiki/Distributed_database" target="_blank" rel="noreferrer noopener">distributed databases</a> come into play.</p>



<p>They break down the data across multiple servers or different geographic locations. This makes your system more resilient, fault-tolerant, and scalable.</p>



<p>Learning about distributed databases gives you a leg up when designing systems that can handle real-world demands. Secondly, understanding the mechanics of data distribution, partitioning, and replication strategies can save your bacon when troubleshooting performance bottlenecks.</p>



<p>It&#8217;s not just a nice-to-have skill; it&#8217;s becoming essential, mainly if you aim to work on large-scale systems. So, understanding distributed databases should be on your radar if you want to stay relevant and keep your skillset on the cutting edge.</p>



<h3 class="wp-block-heading">30. Graph Databases</h3>



<figure class="wp-block-kadence-image kb-image3582_33a95f-f9 size-large"><a href="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Graph-Databases.png" class="kb-advanced-image-link"><img loading="lazy" decoding="async" width="1024" height="574" src="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Graph-Databases-1024x574.png" alt="An illustration of a graph." class="kb-img wp-image-3600" srcset="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Graph-Databases-1024x574.png 1024w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Graph-Databases-300x168.png 300w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Graph-Databases-768x430.png 768w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Graph-Databases.png 1456w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p><a href="https://en.wikipedia.org/wiki/Graph_database" target="_blank" rel="noreferrer noopener">Graph databases</a> are a type of NoSQL database that&#8217;s particularly effective for dealing with interconnected data. They&#8217;re designed to handle complex software where relationships are as meaningful as the data itself. Unlike traditional relational databases, graph databases store connections as first-class entities, making them ideal for modeling relationships and networks.</p>



<p>Graph databases are optimal for querying interconnected data, leading to faster, more efficient operations. This can drastically improve performance, especially when working with complex software systems. Additionally, they can simplify your data model, making it more intuitive and easier to work with.</p>



<h3 class="wp-block-heading">31. Time-Series Databases</h3>



<p>Not all data is created equal; some is time-sensitive, like stock prices, sensor data, and user analytics. That&#8217;s where <a href="https://en.wikipedia.org/wiki/Time_series_database" target="_blank" rel="noreferrer noopener">Time-Series Databases</a> come in. Unlike traditional databases, these are optimized to efficiently store and query data that changes over time.</p>



<p>So, if you&#8217;re working on anything related to IoT, finance, or complex analytics, you&#8217;ll love how much easier and more efficient your life becomes with a Time-Series Database. If you want to stay ahead of the curve and understand how to manage real-world data scenarios, you can&#8217;t afford to skip this one.</p>



<h3 class="wp-block-heading">32. Full-text Search</h3>



<p>Moving on from the importance of understanding Time-Series Databases, another critical skill is mastering <a href="https://en.wikipedia.org/wiki/Full-text_search" target="_blank" rel="noreferrer noopener">Full-text Search</a>. This skill is essential when dealing with large databases.</p>



<p>Full-text Search allows finding specific content within a database, saving time and resources. It&#8217;s not just about keyword search; it&#8217;s about understanding the information&#8217;s context, semantics, and relevance.</p>



<p>The ability to implement Full-text Search efficiently can significantly enhance the user experience, making your software more intuitive and user-friendly. Sharpening your skills in Full-text Search can make you a valuable asset to your team and company.</p>



<h3 class="wp-block-heading">33. Indexing &amp; Query Optimization</h3>



<p>After mastering Full-text Search, you must dive into <a href="https://www.scaler.com/topics/query-optimization-in-dbms/" target="_blank" rel="noreferrer noopener">Indexing and Query Optimization</a>. This skill is pivotal in improving the speed and efficiency of your database queries, a crucial aspect of software engineers&#8217; work.</p>



<p>Indexing organizes data for faster search, while query optimization ensures your SQL queries run efficiently. It&#8217;s like sorting a bookshelf alphabetically to find a book faster and reading only the necessary chapters instead of the whole book.</p>



<p>Your software can underperform or crash under heavy loads without proper indexing and query optimization. So, it&#8217;s not a skill to overlook.</p>



<h3 class="wp-block-heading">34. Cloud Computing</h3>



<figure class="wp-block-kadence-image kb-image3582_4940e1-d3 size-large"><a href="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Cloud-Computing.png" class="kb-advanced-image-link"><img loading="lazy" decoding="async" width="1024" height="574" src="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Cloud-Computing-1024x574.png" alt="An illustration of cloud computing." class="kb-img wp-image-3602" srcset="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Cloud-Computing-1024x574.png 1024w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Cloud-Computing-300x168.png 300w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Cloud-Computing-768x430.png 768w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Cloud-Computing.png 1456w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>Knowing Cloud Computing inside and out is non-negotiable, and here&#8217;s why: it&#8217;s the basis of modern software engineering. Period.</p>



<p>Gone are the days when you had to worry about physical hardware constraints; the cloud lifts those barriers. Being savvy with cloud platforms like <a href="https://aws.amazon.com/" target="_blank" data-type="link" data-id="https://aws.amazon.com/" rel="noreferrer noopener">AWS</a>, <a href="https://azure.microsoft.com/" target="_blank" rel="noreferrer noopener">Azure</a>, or <a href="https://cloud.google.com/" target="_blank" rel="noreferrer noopener">GCP</a> equips you to build, deploy, and scale applications with a speed and efficiency that was unthinkable just a few years ago.</p>



<p>You&#8217;re saving time and tapping into a universe of services and tools that can give your project a tremendous edge. In other words, cloud expertise allows you to focus on creating standout features and innovations rather than getting bogged down with infrastructure woes.</p>



<p>If you&#8217;re serious about your career in software engineering, mastering cloud computing is not optional; it&#8217;s essential.</p>



<h3 class="wp-block-heading">35. DevOps</h3>



<p>In the tech world, there&#8217;s an increasing emphasis on <a href="https://www.atlassian.com/devops" target="_blank" rel="noopener">DevOps</a>. It&#8217;s reshaping how companies develop and deliver software products. Understanding DevOps principles is incredibly beneficial. This methodology bridges the gap between development and operations teams, fostering improved collaboration and productivity.</p>



<p>Knowing DevOps means you understand the entire lifecycle of a software application—from writing the first line of code to deploying it on a cluster of servers and then monitoring its performance.</p>



<p>It&#8217;s about breaking down silos and fostering a culture of collaboration and shared responsibility. And let&#8217;s not forget the tech part. Mastering tools like Docker, Kubernetes, Jenkins, and Terraform can make you indispensable.</p>



<p>So, don&#8217;t skip this one if you want to level up. Trust me, you&#8217;ll thank yourself later.</p>



<h3 class="wp-block-heading">36. Containerization</h3>



<p><a href="https://aws.amazon.com/what-is/containerization/" target="_blank" rel="noreferrer noopener">Containerization</a> has become a crucial part of DevOps practices. It allows for greater efficiency and consistency across different computing environments. As a good software engineer, it&#8217;s my responsibility to ensure that apps run reliably when moved from one computing environment to another. This is where containerization comes in handy.</p>



<p>A container includes an application and all its related configuration files, libraries, and dependencies required for it to run. This ensures that the application will run on any other Linux machine, regardless of any customized settings that the machine might have.</p>



<p><a href="https://www.docker.com/" target="_blank" rel="noreferrer noopener">Docker</a> is a popular tool for automating application deployment, scaling, and container management. Learning this tool can significantly level up your career as a software engineer.</p>



<h3 class="wp-block-heading">37. Container Orchestration</h3>



<figure class="wp-block-kadence-image kb-image3582_3c4000-12 size-large"><a href="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Container-Orchestration.png" class="kb-advanced-image-link"><img loading="lazy" decoding="async" width="1024" height="574" src="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Container-Orchestration-1024x574.png" alt="An illustration of container orchestration." class="kb-img wp-image-3603" srcset="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Container-Orchestration-1024x574.png 1024w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Container-Orchestration-300x168.png 300w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Container-Orchestration-768x430.png 768w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Container-Orchestration.png 1456w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>You&#8217;re probably wondering what comes next after containerization, and that&#8217;s where <a href="https://cloud.google.com/discover/what-is-container-orchestration" target="_blank" rel="noreferrer noopener">container orchestration</a> steps in. I find orchestration invaluable. It&#8217;s the automated configuration and management of systems. It&#8217;s like a conductor directing an orchestra, ensuring all instruments play harmoniously.</p>



<p>Orchestration allows you to test and debug software and scale it in production efficiently. It eliminates manual processes, drastically reducing the possibility of human error. It offers a bird&#8217;s eye view of all processes, making pinpointing and rectifying issues easier.</p>



<p><a href="https://kubernetes.io/" target="_blank" rel="noreferrer noopener">Kubernetes</a> and <a href="https://aws.amazon.com/ecs/" target="_blank" rel="noreferrer noopener">Elastic Container Services (ECS)</a> are some of the popular services in this area.</p>



<h3 class="wp-block-heading">38. Infrastructure as Code (IaC)</h3>



<p><a href="https://learn.microsoft.com/en-us/devops/deliver/what-is-infrastructure-as-code" target="_blank" rel="noreferrer noopener">Infrastructure as Code</a> (IaC) is another pivotal tool reshaping how we manage and provision tech systems. In essence, it&#8217;s where infrastructure configurations become software, allowing for automated and repeatable processes. You can code server and network configurations rather than manually setting them up, making the entire system more efficient and reliable.</p>



<p>IaC is also integral for cloud computing. It means you can manage and provision thousands of servers simultaneously. Using IaC, you can ensure consistency across environments, reduce the potential for human error, and dramatically speed up deployment times.</p>



<h3 class="wp-block-heading">39. Monitoring &amp; Logging</h3>



<p>Monitoring and logging are an integral part of maintaining and optimizing better software.</p>



<p>Think of these tools as your ever-watchful eyes and ears on your software, 24/7. When something goes awry &#8211; and, honestly, something always does &#8211; you won&#8217;t be blindly sifting through thousands of lines of code.</p>



<p>You&#8217;ll have logs to pinpoint exactly what went south and monitoring systems to alert you even before your users notice something&#8217;s off. It&#8217;s all about being proactive rather than reactive.</p>



<p>Without proper monitoring, you&#8217;re flying blind; without logging, you&#8217;re trying to solve a mystery without any clues. Master these skills, and not only will you make your life a lot easier, but you&#8217;ll also become the go-to problem solver on your team. Trust me, that&#8217;s an excellent place to be.</p>



<h3 class="wp-block-heading">40. DevSecOps</h3>



<p><a href="https://www.redhat.com/en/topics/devops/what-is-devsecops" target="_blank" rel="noreferrer noopener">DevSecOps</a> integrates security practices into the DevOps process. Mastering DevSecOps means not merely coding but ensuring the code&#8217;s security from inception to deployment. It&#8217;s about incorporating security checks and balances throughout the software development lifecycle.</p>



<p>This approach demands a good grasp of security concepts, tools, and strong interpersonal skills. Why? Because DevSecOps is all about collaboration. You&#8217;ll need to work closely with development, operations, and security teams, ensuring everyone&#8217;s on the same page.</p>



<p>When you understand DevSecOps, you&#8217;re not just cranking out features; you&#8217;re ensuring those features are robust, scalable, and, most importantly, secure. It&#8217;s about building quality into the product at every step.</p>



<p>It&#8217;s a way to minimize risks, fix vulnerabilities faster, and even get a leg up in your career. Being an engineer who knows how to build great software and secure it is a powerful combo that&#8217;ll make you incredibly valuable to any team.</p>



<h3 class="wp-block-heading">41. FinOps</h3>



<figure class="wp-block-kadence-image kb-image3582_3d83c0-9f size-large"><a href="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-FinOps.png" class="kb-advanced-image-link"><img loading="lazy" decoding="async" width="1024" height="574" src="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-FinOps-1024x574.png" alt="An illustration of engineer monitoring FinOps tools" class="kb-img wp-image-3605" srcset="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-FinOps-1024x574.png 1024w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-FinOps-300x168.png 300w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-FinOps-768x430.png 768w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-FinOps.png 1456w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>Today, every line of code you commit could translate to dollars and cents, thanks to the pay-as-you-go nature of cloud services. I&#8217;ve seen teams spin up resources in the cloud like there&#8217;s no tomorrow, only to get a jaw-dropping bill at the end of the month.</p>



<p>That&#8217;s where <a href="https://www.finops.org/introduction/what-is-finops/" target="_blank" rel="noreferrer noopener">FinOps</a> comes into play. Understanding FinOps, short for Financial Operations, helps you make smarter decisions about resource allocation, cost optimization, and how to get the best bang for your buck in the cloud. It&#8217;s like being the CFO of your little software world.</p>



<p>People take notice when you can discuss cost-efficiency, performance, and scalability during team meetings. Your managers will love you for it; it sets you apart as a well-rounded engineer. So don&#8217;t underestimate the power of knowing your FinOps!</p>



<h3 class="wp-block-heading">42. Systems Programming</h3>



<p>In systems programming, you&#8217;re responsible for creating and maintaining the system&#8217;s software that&#8217;ll run all other software. You might be tasked with developing operating systems, databases, or real-time systems.</p>



<p>This requires a deep understanding of both hardware and software interactions. You&#8217;ll need to be proficient in languages like <a href="https://en.wikipedia.org/wiki/C_(programming_language)" target="_blank" rel="noreferrer noopener">C</a> or <a href="https://en.wikipedia.org/wiki/C%2B%2B" target="_blank" rel="noreferrer noopener">C++</a>, as these allow for direct manipulation of hardware resources. It&#8217;s also crucial to understand concurrency, memory management, and how to optimize for performance.</p>



<p>Being a systems programmer isn&#8217;t for everyone; it&#8217;s complex and challenging. But if you enjoy getting under the hood and tinkering with the inner workings of a system, it&#8217;s a gratifying and sought-after skill.</p>



<h3 class="wp-block-heading">43. Embedded Systems</h3>



<p>Understanding <a href="https://en.wikipedia.org/wiki/Embedded_system" target="_blank" rel="noreferrer noopener">embedded systems</a> can open up new arenas for you as a software engineer. Embedded systems are at the heart of every microcontroller, sensor, and smart device.</p>



<p>From smart thermostats to advanced automotive controls, they make the &#8216;intelligence&#8217; in &#8216;artificial intelligence&#8217; possible at the hardware level. It&#8217;s not just about coding; it&#8217;s about making software and hardware work harmoniously, often with limited resources.</p>



<p>This skill also broadens your problem-solving palette, as you&#8217;ll encounter challenges distinct from traditional software development—like real-time processing and power management. And let&#8217;s not forget the demand for engineers proficient in embedded systems is continually rising. So, if you&#8217;ve got your eye on the long game, mastering embedded systems is a career move you won&#8217;t regret.</p>



<h3 class="wp-block-heading">44. Agile Methodologies</h3>



<p>Shifting gears to <a href="https://www.atlassian.com/agile" target="_blank" rel="noreferrer noopener">Agile Methodologies</a>, you&#8217;ll find it&#8217;s a set of methodologies that promote flexibility and collaboration among team members. It&#8217;s not just about knowing how to code; it&#8217;s also about being able to work as a unit towards a shared goal.</p>



<p>In an Agile environment, you deliver smaller, usable portions of the software at the end of every sprint. <a href="https://www.atlassian.com/agile/scrum" target="_blank" rel="noreferrer noopener">Scrum</a>, a subset of Agile, provides a framework for managing and controlling iterative work at the project level. It&#8217;s a highly sought-after skill as it optimizes productivity and adapts to changes swiftly.</p>



<h3 class="wp-block-heading">45. Test-Driven Development (TDD)</h3>



<figure class="wp-block-kadence-image kb-image3582_dea8b3-e1 size-large"><a href="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-TDD.png" class="kb-advanced-image-link"><img loading="lazy" decoding="async" width="1024" height="574" src="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-TDD-1024x574.png" alt="" class="kb-img wp-image-3606" srcset="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-TDD-1024x574.png 1024w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-TDD-300x168.png 300w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-TDD-768x430.png 768w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-TDD.png 1456w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p><a href="https://en.wikipedia.org/wiki/Test-driven_development" target="_blank" rel="noreferrer noopener">Test-Driven Development</a> (TDD) is another crucial competency. It forces you to think before you code. In TDD, you write a test outlining what you want your code to achieve, then write code satisfying that test. Simple, yet incredibly powerful.</p>



<p>It requires you to write tests before beginning the coding process. TDD lets you write cleaner, more efficient code, reducing the time spent on debugging. It&#8217;s a method that guarantees quality assurance from the onset, a crucial aspect in today&#8217;s agile software development cycles.&nbsp;</p>



<p>Understanding and applying TDD isn&#8217;t just about writing tests. It&#8217;s about improving software design. In addition, it also saves countless hours in debugging.</p>



<h3 class="wp-block-heading">46. Behavior-Driven Development (BDD)</h3>



<p>In a similar vein, <a href="https://en.wikipedia.org/wiki/Behavior-driven_development" target="_blank" rel="noreferrer noopener">Behavior-Driven Development</a> (BDD) is another essential competency that&#8217;s gaining momentum in the tech industry.&nbsp;BDD helps bridge that often confusing gap between developers and stakeholders. It turns user stories and business requirements into actual tests immediately.</p>



<p>But it&#8217;s not just about turning requirements into code. BDD creates a shared language everyone can understand &#8211; developers, QA, product managers, and business stakeholders. This makes collaboration so much easier. The devs write code that&#8217;s easier to test, and QA knows precisely what they&#8217;re testing against. It&#8217;s a win-win.</p>



<p>Your code becomes more maintainable and flexible, making it easier to adapt when business needs change, which will happen sooner rather than later. The tests become a form of documentation, so any new engineer jumping into the project quickly understands how things should work.</p>



<h3 class="wp-block-heading">47. Secure Coding</h3>



<p>In an era where cybersecurity threats are escalating, software engineers must master secure coding. It&#8217;s not just about developing functional software anymore; it&#8217;s also about ensuring its safety.</p>



<p>You might build the most feature-rich, scalable, and user-friendly application out there, but if it&#8217;s not secure, you invite hackers to a buffet. Think of secure coding as the foundation of a house. No matter how pretty the house looks, everything could come crashing down if the foundation is shaky.</p>



<p>So, understanding <a href="https://owasp.org/www-project-top-ten/" target="_blank" rel="noreferrer noopener">OWASP best practices</a>, input validation, secure data storage, and how to write code resistant to common vulnerabilities like SQL injection or XSS attacks should be on your radar. It makes you a more well-rounded engineer and a trustworthy guardian of your users&#8217; data.</p>



<h3 class="wp-block-heading">48. Authentication &amp; Authorization</h3>



<figure class="wp-block-kadence-image kb-image3582_e03bc0-00 size-large"><a href="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Authentication-Authorization.png" class="kb-advanced-image-link"><img loading="lazy" decoding="async" width="1024" height="574" src="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Authentication-Authorization-1024x574.png" alt="An illustration of a digital bouncer checking the identities of individuals." class="kb-img wp-image-3607" srcset="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Authentication-Authorization-1024x574.png 1024w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Authentication-Authorization-300x168.png 300w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Authentication-Authorization-768x430.png 768w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Authentication-Authorization.png 1456w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p><a href="https://auth0.com/intro-to-iam/what-is-authentication" target="_blank" rel="noreferrer noopener">Authentication</a> is the process of verifying a user&#8217;s identity. It&#8217;s like a bouncer checking your ID at a club. You&#8217;re not getting in if you&#8217;re not who you say you are.</p>



<p><a href="https://auth0.com/intro-to-iam/what-is-authorization" target="_blank" rel="noreferrer noopener">Authorization</a>, conversely, determines what you can do once you&#8217;re inside. It&#8217;s akin to the club&#8217;s VIP list. If you&#8217;re on it, you can access exclusive areas. If you&#8217;re not, you&#8217;re restricted. In software terms, it defines a user&#8217;s privileges within a system.</p>



<p>In a nutshell, while authentication asks &#8216;Who are you?&#8217;, authorization asks &#8216;What are you allowed to do?&#8217;.</p>



<p>Being proficient in modern authentication and authorization methods will allow you to build systems that can adapt to emerging security challenges. It&#8217;s not just about knowing how to implement OAuth or JWT tokens; it&#8217;s about understanding the underlying principles that can be applied no matter the tech stack.</p>



<h3 class="wp-block-heading">49. Encryption &amp; Cryptography</h3>



<p><a href="https://en.wikipedia.org/wiki/Encryption" target="_blank" rel="noreferrer noopener">Encryption</a> is converting data into a code to prevent unauthorized access. <a href="https://en.wikipedia.org/wiki/Cryptography" target="_blank" rel="noreferrer noopener">Cryptography</a> is the practice and study of secure communication techniques in the presence of third parties.</p>



<p>When you know how to encrypt data and implement secure communication protocols, you&#8217;re not just writing code but building trust. Whether it&#8217;s customer passwords, financial information, or any other sensitive data, you often hold the kingdom&#8217;s keys.</p>



<p>Mess up encryption, and you&#8217;re risking your company and your users.&nbsp;</p>



<h3 class="wp-block-heading">50. Web Application Firewalls (WAF)</h3>



<p>Understanding <a href="https://www.cloudflare.com/en-au/learning/ddos/glossary/web-application-firewall-waf/" target="_blank" rel="noreferrer noopener">web application firewalls</a> is necessary, as they protect your web applications from malicious attacks. I&#8217;ve seen how these systems scrutinize incoming traffic, blocking suspicious activity.</p>



<p>Web application firewalls, or WAFs, can be network-based, host-based, or cloud-based. They&#8217;re designed to protect web applications by filtering and monitoring HTTP traffic between them and the Internet. Understanding how these firewalls work and how they can be configured to provide maximum security is essential.</p>



<p>Moreover, knowing how to implement WAFs correctly can save your organization from costly breaches and is a skill worth investing time in.</p>



<h3 class="wp-block-heading">51. Computer Networking</h3>



<p>It&#8217;s fundamental to grasp how data travels from one computer to another over the internet or within a network. It would be best to understand the basics of <a href="https://en.wikipedia.org/wiki/IP_address" target="_blank" data-type="link" data-id="https://en.wikipedia.org/wiki/IP_address" rel="noreferrer noopener">IP addresses</a>, <a href="https://en.wikipedia.org/wiki/Transmission_Control_Protocol" target="_blank" rel="noreferrer noopener">TCP</a>/<a href="https://en.wikipedia.org/wiki/User_Datagram_Protocol" target="_blank" rel="noreferrer noopener">UDP</a>, <a href="https://en.wikipedia.org/wiki/Domain_Name_System" target="_blank" data-type="link" data-id="https://en.wikipedia.org/wiki/Domain_Name_System" rel="noreferrer noopener">DNS</a>, <a href="https://en.wikipedia.org/wiki/HTTP" target="_blank" rel="noreferrer noopener">HTTP</a>/HTTPS, and more.</p>



<p>Your application doesn&#8217;t exist in isolation. It&#8217;s communicating constantly, whether with databases, other services, or external APIs. And all of that communication happens over a network. If you don&#8217;t get how networks function, you&#8217;re flying blind.</p>



<p>Have you ever had to debug a latency issue? Or figure out why a service is unreachable? Or maybe you&#8217;ve wrestled with a cloud architecture that doesn&#8217;t seem to let data flow as intended.</p>



<p>These are all scenarios where a solid grasp of networking principles can be your best friend. A little networking knowledge will save you a lot of headaches in the long run and make you a more competent, effective engineer.</p>



<h3 class="wp-block-heading">52. Design Patterns</h3>



<p><a href="https://en.wikipedia.org/wiki/Software_design_pattern" target="_blank" rel="noreferrer noopener">Design Patterns</a> are like the blueprints for solving recurring challenges in software design.</p>



<p>I can&#8217;t emphasize enough how invaluable design patterns have been in improving the quality of the software I&#8217;ve worked on. Understanding design patterns will help you write cleaner, more maintainable code and speed up the development process because you&#8217;re not reinventing the wheel every time a common problem surfaces.</p>



<p>You’ll spend less time debugging and more time adding features, and who doesn&#8217;t want that? So yeah, if you&#8217;re serious about elevating your engineering skills, mastering design patterns is non-negotiable.</p>



<h3 class="wp-block-heading">53. Monolithic vs. Distributed Architectures</h3>



<figure class="wp-block-kadence-image kb-image3582_04f100-83 size-large"><a href="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Monolithic-vs-Distributed.png" class="kb-advanced-image-link"><img loading="lazy" decoding="async" width="1024" height="574" src="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Monolithic-vs-Distributed-1024x574.png" alt="An illustration of a monolithic architecture vs a distributed one." class="kb-img wp-image-3608" srcset="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Monolithic-vs-Distributed-1024x574.png 1024w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Monolithic-vs-Distributed-300x168.png 300w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Monolithic-vs-Distributed-768x430.png 768w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Monolithic-vs-Distributed.png 1456w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>In system architecture, it&#8217;s essential to understand the difference between monolithic and distributed structures.</p>



<p>A <a href="https://www.geeksforgeeks.org/monolithic-architecture/" target="_blank" rel="noreferrer noopener">monolithic architecture</a> is a traditional unified model where all components reside within one system. It&#8217;s simple to develop, deploy, and test, but it can be challenging to scale and maintain.</p>



<p>On the other hand, a distributed architecture, such as <a href="https://martinfowler.com/articles/microservices.html" target="_blank" rel="noreferrer noopener">Microservices</a>, breaks down the system into independent services, allowing for better scalability and flexibility. However, it&#8217;s more complex to design and manage.</p>



<p>As a software engineer, evaluating the project&#8217;s needs is crucial before selecting an architecture. Understanding the advantages and disadvantages of each will enable you to make informed decisions, potentially improving the overall productivity and success of your projects.</p>



<h3 class="wp-block-heading">54. Domain-Driven Design</h3>



<p>You&#8217;ll find that <a href="https://martinfowler.com/bliki/DomainDrivenDesign.html" target="_blank" rel="noreferrer noopener">Domain-Driven Design</a> (DDD) is a valuable approach for complex systems, focusing on the core domain and its logic rather than the technology used. It&#8217;s a strategic tool for designing high-quality software. DDD&#8217;s strength is its emphasis on collaboration and communication among domain experts and developers.</p>



<p>I&#8217;ve found that DDD&#8217;s real-world modeling facilitates a deep understanding of the business, making it easier to solve problems and anticipate future needs. It allows me to create flexible, scalable software that&#8217;s easier to maintain and evolve.</p>



<p>However, DDD isn&#8217;t always the best choice. It&#8217;s complex and time-consuming, making it unsuitable for simple applications. But for complex systems, it&#8217;s an invaluable skill. Mastering DDD can undoubtedly elevate your career to new heights.</p>



<h3 class="wp-block-heading">55. Event-Driven Architecture (EDA)</h3>



<p><a href="https://martinfowler.com/articles/201701-event-driven.html" target="_blank" data-type="link" data-id="https://martinfowler.com/articles/201701-event-driven.html" rel="noreferrer noopener">Event-driven architecture</a> (EDA) is another crucial concept making waves in the tech industry. EDA is a design paradigm where the flow of the program is determined by events such as user actions, sensor outputs, or messages from other services. It&#8217;s about reacting to changes in state, typically using asynchronous callbacks.</p>



<p>In an EDA, I can develop adaptive, responsive, and scalable systems. It&#8217;s particularly effective for applications where real-time updates and high responsiveness are crucial. I&#8217;ve found it&#8217;s particularly good for designing modern, agile applications that need to adapt quickly to changing conditions.</p>



<p>Mastering EDA is becoming a must-have skill for software engineers. Technologies like<a href="https://eranstiller.com/rabbitmq-vs-kafka-an-architects-dilemma-part-1"> </a><a href="https://eranstiller.com/rabbitmq-vs-kafka" data-type="link" data-id="https://eranstiller.com/rabbitmq-vs-kafka">RabbitMQ and Apache Kafka</a> are popular tools for implementing EDA, and you should get to grips with them.</p>



<h3 class="wp-block-heading">56. Serverless Architectures</h3>



<p><a href="https://learn.microsoft.com/en-us/dotnet/architecture/serverless/" target="_blank" data-type="link" data-id="https://learn.microsoft.com/en-us/dotnet/architecture/serverless/" rel="noreferrer noopener">Serverless architectures</a> are gaining traction for their cost-effectiveness and operational simplicity. Instead of managing and operating servers, we can offload that responsibility to a cloud provider. This means we only pay for the computing time we consume, and there&#8217;s no charge when our code isn&#8217;t running.</p>



<p>But it&#8217;s not just about cost. Serverless architectures also streamline operational management. You don&#8217;t have to worry about system patching, capacity provisioning, or software maintenance. These tasks are all handled by the provider.</p>



<p>Despite these benefits, serverless isn&#8217;t a panacea. It has limitations, such as cold starts and vendor lock-in. However, with the proper use case, serverless can be a powerful tool in my software engineering arsenal.</p>



<h3 class="wp-block-heading">57. Evolutionary Architectures</h3>



<figure class="wp-block-kadence-image kb-image3582_153db2-70 size-large"><a href="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Evolutionary-Architecture.png" class="kb-advanced-image-link"><img loading="lazy" decoding="async" width="1024" height="574" src="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Evolutionary-Architecture-1024x574.png" alt="An illustration of an evolving architecture." class="kb-img wp-image-3609" srcset="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Evolutionary-Architecture-1024x574.png 1024w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Evolutionary-Architecture-300x168.png 300w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Evolutionary-Architecture-768x430.png 768w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Evolutionary-Architecture.png 1456w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p><a href="https://evolutionaryarchitecture.com/" target="_blank" rel="noreferrer noopener">Evolutionary architectures</a> are designed to be flexible and adaptable to changes. These architectures are built with the expectation of change, aiming to allow an application to evolve as business requirements shift. They&#8217;re highly flexible and can handle incremental changes without needing significant system rework.</p>



<p>A fundamental principle of evolutionary architecture is to make change as easy as possible. It&#8217;s about minimizing the cost of change rather than resisting it. This is achieved through modular designs, loose coupling, and high cohesion.</p>



<p>Learning to build evolutionary architectures can significantly enhance a software engineer&#8217;s skill set. It&#8217;s an investment in future-proofing your career.</p>



<h3 class="wp-block-heading">58. Multi-Cloud Strategies</h3>



<p>In today&#8217;s tech landscape, understanding and implementing <a href="https://cloud.google.com/learn/what-is-multicloud" data-type="link" data-id="https://cloud.google.com/learn/what-is-multicloud" target="_blank" rel="noreferrer noopener">multi-cloud strategies</a> is becoming increasingly essential. I&#8217;ve seen firsthand how these strategies can provide flexibility, prevent vendor lock-in, and enhance disaster recovery protocols.</p>



<p>Utilizing multiple cloud service providers allows me to distribute resources and applications across different platforms, reducing the risk of service disruptions. It&#8217;s a balancing act, maintaining optimal performance while navigating the distinct features of each cloud provider.</p>



<p>The complexity of multi-cloud strategies can be intimidating, but I&#8217;ve found that the benefits significantly outweigh the challenges.</p>



<h3 class="wp-block-heading">59. Extract-Transform-Load (ETL) Processes</h3>



<p><a href="https://aws.amazon.com/what-is/etl/" target="_blank" rel="noreferrer noopener">ETL</a>, or Extract, Transform, Load, is a three-step process used in databases and data warehouses. It&#8217;s about fetching data from diverse sources, refining it, and loading it into a data repository.</p>



<p>You&#8217;re extracting data from various sources &#8211; databases, APIs, or even Excel spreadsheets. Then you&#8217;re transforming that data, cleaning it up, maybe aggregating it, basically preparing it for analysis. Finally, you&#8217;re loading it into a data warehouse or some other system where it&#8217;s easy to analyze.</p>



<p>Understanding ELT is essential as you&#8217;ll often find yourself at the intersection of data and application logic. It will help you work more effectively with data scientists and improve data quality, a skill in high demand. So, if you&#8217;ve got ETL down, you&#8217;re not just a coder; you&#8217;re a data wrangler, a bridge between the raw data and the insights that drive business decisions.</p>



<h3 class="wp-block-heading">60. Big Data Tools</h3>



<p>Speaking of ETL, mastering big data tools like <a href="https://hadoop.apache.org/" target="_blank" rel="noreferrer noopener">Hadoop</a> and <a href="https://spark.apache.org/" target="_blank" rel="noreferrer noopener">Spark</a> can enhance your data handling capabilities. I&#8217;ve found that these tools are integral for managing colossal data sets, performing complex transformations, and conducting rapid data analysis.</p>



<p>Hadoop, for instance, provides a robust framework for distributed storage and processing of large data sets across clusters of computers. It&#8217;s scalable, fault-tolerant, and flexible.</p>



<p>Spark, on the other hand, excels at real-time data processing. It&#8217;s faster than Hadoop for complex applications and allows in-memory computations, reducing the need for disk storage.</p>



<p>When used effectively, both these tools can dramatically enhance ETL processes and overall data management. I&#8217;d strongly recommend any software engineer to master them.</p>



<h3 class="wp-block-heading">61. Artificial Intelligence (AI) &amp; Machine Learning (ML)</h3>



<figure class="wp-block-kadence-image kb-image3582_4c0c12-e9 size-large"><a href="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Machine-Learning-AI.png" class="kb-advanced-image-link"><img loading="lazy" decoding="async" width="1024" height="574" src="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Machine-Learning-AI-1024x574.png" alt="An illustration of AI used by humans." class="kb-img wp-image-3611" srcset="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Machine-Learning-AI-1024x574.png 1024w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Machine-Learning-AI-300x168.png 300w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Machine-Learning-AI-768x430.png 768w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Machine-Learning-AI.png 1456w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p><a href="https://en.wikipedia.org/wiki/Artificial_intelligence" target="_blank" rel="noreferrer noopener">Artificial Intelligence</a> (AI) and <a href="https://en.wikipedia.org/wiki/Machine_learning" target="_blank" rel="noreferrer noopener">Machine Learning</a> (ML) are at the heart of many innovative technologies today. The applications are vast and growing, from self-driving cars to voice recognition systems.</p>



<p>Mastering skills like Python, R, TensorFlow, and other AI programming tools will put you in an advantageous position. It&#8217;s not just about writing code; it&#8217;s also about understanding algorithms, neural networks, and other complex systems.</p>



<p>If you can harness these skills, You&#8217;ll be able to create cutting-edge applications that could shape the future of tech.</p>



<h3 class="wp-block-heading">62. Business Intelligence (BI) &amp; Data Visualization</h3>



<p>In addition to AI and machine learning, exploring the realm of <a href="https://en.wikipedia.org/wiki/Business_intelligence" target="_blank" rel="noreferrer noopener">Business Intelligence</a> (BI) and Data Visualization is crucial. The ability to interpret and present complex data in a visually engaging and understandable manner is invaluable.</p>



<p>Tableau, PowerBI, and similar tools are becoming increasingly important in the business sector. These tools allow for extracting meaningful insights from data, aiding decision-making processes.</p>



<p>You&#8217;re not just a code monkey when you understand and know how to use these tools. You&#8217;re a well-rounded engineer who understands the business side of things. That&#8217;s the kind of engineer who climbs the software engineering career ladder.</p>



<h3 class="wp-block-heading">63. Augmented &amp; Virtual Reality</h3>



<p>Mastering Augmented and Virtual Reality (AR/VR) can significantly level up your career. These technologies are no longer just for gaming—they&#8217;re reshaping industries like healthcare, education, and real estate.</p>



<p>AR/VR development requires a blend of skills. You&#8217;ll possibly need proficiency in C# and Unity, the leading game development platform. Understanding 3D modeling and computer graphics is also crucial. Plus, you&#8217;ll need to familiarize yourself with ARKit and ARCore, Apple, and Google&#8217;s respective AR development platforms.</p>



<p>But most importantly, you&#8217;ll need creativity and an innovative mindset. With AR/VR, we&#8217;re not just developing software. We&#8217;re creating immersive, interactive experiences. It&#8217;s a thrilling field that&#8217;s only going to grow.</p>



<h3 class="wp-block-heading">64. Game Development</h3>



<p>The game development process is a masterclass in managing complex systems and real-time performance. You&#8217;re juggling graphics, physics, AI, and user input, all while keeping an eye on optimization.</p>



<p>It pushes you to think about architecture, algorithms, and data structures in ways you might not encounter in your typical CRUD applications. It also demands creativity in problem-solving because, let&#8217;s face it, game development is full of unique challenges you won&#8217;t find in a business software suite.</p>



<p>And if you&#8217;re in a leadership role like me, game development is a fantastic team-building exercise. It integrates a mix of skills, from coding to graphics to sound design, teaching the team to deliver a finished product collaboratively. The skills and insights you gain from game development will make you a better engineer while having a blast.</p>



<h3 class="wp-block-heading">65. Internet of Things (IoT)</h3>



<figure class="wp-block-kadence-image kb-image3582_a294a5-5d size-large"><a href="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Internet-of-Things.png" class="kb-advanced-image-link"><img loading="lazy" decoding="async" width="1024" height="574" src="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Internet-of-Things-1024x574.png" alt="An illustration of an IoT network with various devices." class="kb-img wp-image-3612" srcset="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Internet-of-Things-1024x574.png 1024w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Internet-of-Things-300x168.png 300w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Internet-of-Things-768x430.png 768w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Internet-of-Things.png 1456w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>The <a href="https://en.wikipedia.org/wiki/Internet_of_things" target="_blank" rel="noreferrer noopener">Internet of Things</a> (IoT) is a rapidly evolving technology that&#8217;s having a massive impact on our daily lives. It&#8217;s a network of physical devices, vehicles, and other items embedded with sensors and software, enabling them to connect and exchange data.</p>



<p>Learning IoT skills is essential. You must understand embedded systems, networking protocols, data analytics, and cloud computing. You must also be proficient in programming languages like Python, JavaScript, and C++, commonly used in IoT development.</p>



<p>It&#8217;s also essential to be in sync with the latest security protocols, as IoT devices are often targets for cyberattacks.</p>



<p>Mastering IoT can certainly level up your career in the tech industry.</p>



<h3 class="wp-block-heading">66. Blockchain, Cryptocurrencies and Smart Contracts</h3>



<p><a href="https://en.wikipedia.org/wiki/Blockchain" target="_blank" rel="noreferrer noopener">Blockchain</a> is a decentralized ledger that securely records transactions across many computers. Cryptocurrencies, like Bitcoin and Ethereum, are digital or virtual currencies that use cryptography for security.</p>



<p>The technology has matured to the point where it&#8217;s not just about Bitcoin or Ethereum anymore; it&#8217;s about creating secure, transparent systems for all sorts of applications &#8211; from supply chain management to secure voting systems &#8211; in the form of <a href="https://en.wikipedia.org/wiki/Smart_contract" target="_blank" rel="noreferrer noopener">Smart Contracts</a>.</p>



<p>Understanding these technologies isn&#8217;t just about knowing the buzzwords; it&#8217;s about understanding how they work, their potential applications, and their challenges.</p>



<p>Understanding the basic principles of blockchain has given me a unique perspective in strategy meetings and helped me make more informed decisions on tech stacks and architecture.</p>



<h3 class="wp-block-heading">67. Effective Peer Communication</h3>



<p>I can&#8217;t stress enough how crucial effective communication skills are in our field.</p>



<p>Sure, we&#8217;re in the business of writing code, creating algorithms, and solving complex technical challenges. But none of that happens in a vacuum. You&#8217;ll collaborate with a team, sometimes across different time zones and cultures, to bring a project to life. And this is where things can get messy if you&#8217;re not careful.</p>



<p>Miscommunication or a lack of communication can lead to duplicated efforts, missed deadlines, and even failed projects. I&#8217;ve seen brilliant engineers struggle simply because they couldn&#8217;t articulate their thoughts clearly or understand the perspectives of their peers. Conversely, I&#8217;ve witnessed projects soar to success mainly because the team was in sync, thanks to excellent communication.</p>



<p>So, whether it&#8217;s explaining your code to a junior team member, negotiating timelines with a product manager, or actively listening during a team meeting, effective peer communication is a skill you want to master. Trust me; it&#8217;s as essential as any programming language you&#8217;ll ever learn.</p>



<h3 class="wp-block-heading">68. Problem-Solving Skills</h3>



<figure class="wp-block-kadence-image kb-image3582_330b47-d2 size-large"><a href="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Problem-Solving.png" class="kb-advanced-image-link"><img loading="lazy" decoding="async" width="1024" height="574" src="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Problem-Solving-1024x574.png" alt="A software engineer working hard to solve a problem." class="kb-img wp-image-3613" srcset="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Problem-Solving-1024x574.png 1024w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Problem-Solving-300x168.png 300w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Problem-Solving-768x430.png 768w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Problem-Solving.png 1456w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>Whether debugging a complex issue at 3 a.m. or figuring out how to architect a new feature to scale efficiently, you will face challenges not covered in the docs or Stack Overflow.</p>



<p>Coding is often the easy part. The actual game is about understanding problems deeply and finding practical solutions. Being strong in problem-solving means you can break down a complex issue into manageable pieces, reason clearly about potential solutions, and make decisions based on data, not just gut feeling.</p>



<p>Plus, you know those elusive &#8216;Aha!&#8217; moments that make coding so satisfying? Those come a lot more frequently when you&#8217;re a good problem solver. Investing time honing your problem-solving skills is like putting money in a high-interest savings account for your career.</p>



<h3 class="wp-block-heading">69. Time-Management Skills</h3>



<p>We&#8217;ve all been there: deadlines closing in, back-to-back meetings, and last-minute bugs. Your coding skills might be top-notch, but you&#8217;ll be stuck in perpetual firefighting mode without good time management.</p>



<p>Being able to allocate your time wisely lets you juggle coding, debugging, team meetings, and even continuous learning. Proper time management allows you to prioritize tasks so that not everything is a &#8220;code red&#8221; situation. Plus, let&#8217;s face it, we all want a work-life balance.</p>



<p>Mastering time management means you&#8217;re not consistently pulling all-nighters or spending weekends glued to your screen. It&#8217;s about efficiently delivering quality work and still having time for yourself, your family, or even that side project you&#8217;ve been putting off.</p>



<p>It&#8217;s a balancing act, but time management can become second nature with practice.</p>



<h3 class="wp-block-heading">70. Team Collaboration</h3>



<p>Over the years, I&#8217;ve realized that software engineering isn&#8217;t just about churning out lines of code; it&#8217;s a team sport.</p>



<p>Sure, you could be a whiz at Python or a virtuoso of Java, but your projects will hit roadblocks if you can&#8217;t work effectively with others. Teamwork is where the rubber meets the road in this industry. When collaborating well, you can catch bugs faster, brainstorm innovative solutions, and even spread knowledge.</p>



<p>You&#8217;d be surprised how much you can learn by discussing a problem with a teammate! And let&#8217;s not forget that many eyes make bugs shallow; the more people who review the code, the better it tends to be. So don&#8217;t underestimate the power of team collaboration. It&#8217;s not a &#8220;soft skill&#8221; &#8211; it&#8217;s a core skill.</p>



<h3 class="wp-block-heading">71. Critical Thinking</h3>



<p>Critical thinking is an essential aspect of my role. It allows me to analyze complex issues and devise practical solutions. It&#8217;s not just about finding bugs in the code, thinking about how the software will be used, and identifying potential problems before they occur.</p>



<p>I must anticipate user behavior, consider security risks, and ensure optimal performance. This requires a deep understanding of the software&#8217;s architecture, the programming languages, and the systems it&#8217;ll interact with.</p>



<p>Critical thinking enables you to analyze a problem from multiple angles, assess the pros and cons of different approaches, and foresee potential roadblocks. A strong critical thinking ability can distinguish a great software engineer from a good one.</p>



<h3 class="wp-block-heading">72. Negotiation Skills</h3>



<figure class="wp-block-kadence-image kb-image3582_ff80f1-7b size-large"><a href="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Negotiations-Skills.png" class="kb-advanced-image-link"><img loading="lazy" decoding="async" width="1024" height="574" src="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Negotiations-Skills-1024x574.png" alt="An illustration of two software developers negotiating." class="kb-img wp-image-3615" srcset="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Negotiations-Skills-1024x574.png 1024w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Negotiations-Skills-300x168.png 300w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Negotiations-Skills-768x430.png 768w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Negotiations-Skills.png 1456w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>As a software engineer, you might not associate negotiation skills with your job. But it&#8217;s integral to your career advancement. Often, I&#8217;ve had to negotiate timelines, resources, or even the scope of a project. It&#8217;s not just about winning an argument or getting my way; it&#8217;s about finding common ground that benefits all parties involved.</p>



<p>I&#8217;ve learned that good negotiation skills lead to better collaboration and improved team dynamics. Additionally, they&#8217;ve been invaluable during job offers and salary discussions. So, understanding and mastering the art of negotiation is a worthwhile investment for any software engineer aiming to rise in their career.</p>



<h3 class="wp-block-heading">73. Mentorship &amp; Teaching</h3>



<p>In the realm of mentorship and teaching, it&#8217;s essential to note that imparting knowledge to others isn&#8217;t just beneficial for them. It can also enhance one&#8217;s understanding and perspective.</p>



<p>A software engineer&#8217;s technical prowess is often measured by what they can do and how effectively they can guide others in doing the same. In my experience, teaching coding enhances my skills as I&#8217;m forced to break down complex concepts into understandable parts.</p>



<p>Furthermore, mentoring junior engineers fosters a culture of constant learning and skill development within the team. Thus, honing my teaching and mentorship abilities is critical to my professional growth.</p>



<h3 class="wp-block-heading">74. Peer Networking</h3>



<p>It&#8217;s vital to understand that networking plays a significant role in the tech industry, often opening doors to new opportunities and collaborations. I&#8217;ve found that connecting with peers and industry leaders has allowed me to gain insights into the latest technologies, trends, and best practices.</p>



<p>It&#8217;s not just about meeting people but building meaningful relationships. Active participation in online forums, tech conferences, webinars, and social networks like LinkedIn can be beneficial.</p>



<p>It&#8217;s worth noting that networking isn&#8217;t a one-way street; it&#8217;s about mutual benefit. Sharing my knowledge and experiences, I contribute to the tech community, which, in turn, strengthens my professional network.</p>



<p>Therefore, networking is an essential skill every software engineer should cultivate.</p>



<h3 class="wp-block-heading">75. Public Speaking &amp; Presentations</h3>



<figure class="wp-block-kadence-image kb-image3582_efb2c2-aa size-large"><a href="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Public-Speaking.png" class="kb-advanced-image-link"><img loading="lazy" decoding="async" width="1024" height="574" src="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Public-Speaking-1024x574.png" alt="An illustration of public speaking." class="kb-img wp-image-3616" srcset="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Public-Speaking-1024x574.png 1024w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Public-Speaking-300x168.png 300w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Public-Speaking-768x430.png 768w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Public-Speaking.png 1456w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>Public speaking and presentations can boost your professional image and visibility in the tech industry. It&#8217;s not just about writing code. It&#8217;s also about conveying your ideas effectively to colleagues, clients, and stakeholders.</p>



<p>Strong presentation skills help you communicate your point during team meetings and client presentations.</p>



<p>Moreover, when presenting at tech conferences or seminars, you can showcase your technical expertise while enhancing your reputation in the field. These engagements often lead to new opportunities and collaborations.</p>



<h3 class="wp-block-heading">76. Personal Branding &amp; Online Presence</h3>



<p>It&#8217;s not enough to be technically proficient in my field. You must also present yourself as a knowledgeable professional in the digital world. In today&#8217;s era, your online presence is your business card, and a solid personal brand can elevate your career to greater heights.</p>



<p>You must strategically utilize platforms like LinkedIn, GitHub, and personal blogs to showcase your skills, knowledge, and projects. This not only gives me credibility but also opens up endless opportunities for networking and professional growth.</p>



<h2 class="wp-block-heading">How Can I Improve My Software Development Skills?</h2>



<figure class="wp-block-kadence-image kb-image3582_d9a371-12 size-large"><a href="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Improve-Skills.png" class="kb-advanced-image-link"><img loading="lazy" decoding="async" width="1024" height="574" src="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Improve-Skills-1024x574.png" alt="An illustration of skills improvement." class="kb-img wp-image-3618" srcset="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Improve-Skills-1024x574.png 1024w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Improve-Skills-300x168.png 300w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Improve-Skills-768x430.png 768w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Improve-Skills.png 1456w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>I&#8217;ve found that continuous learning is crucial in improving my software development skills. This allows me to build a robust and diverse skill set over time.</p>



<p>I&#8217;ve also learned that gaining practical experience through hands-on projects and tasks is invaluable. This helps reinforce theoretical knowledge and allows me to apply what I&#8217;ve learned in real-world scenarios.</p>



<h3 class="wp-block-heading">Continuous Learning</h3>



<p>Technologies come and go; what&#8217;s hot today might be obsolete tomorrow. Embracing continuous learning can significantly boost your software engineering career. It&#8217;s a constantly evolving field, and staying up-to-date with the latest trends and technologies has kept me competitive.</p>



<p><a href="https://eranstiller.com/software-engineering-books" data-type="post" data-id="3639">Software engineering books</a> are an essential resource that can especially help when learning timeless techniques such as design patterns, domain domain-driven design methods of working with legacy code. These texts can offer a rich knowledge base, allowing you to design robust and scalable systems.</p>



<p>Online platforms like Pluralsight, Coursera, and Udemy offer valuable courses in advanced topics and help save time. I often spend time outside work learning new programming languages, exploring innovative software tools, and understanding emerging methodologies.</p>



<p>And, of course, software development communities such as X (formerly known as Twitter), tech meetups, and webinars can be a gold mine of knowledge.</p>



<p>More than just improving my technical abilities, continuous learning has enhanced my problem-solving and critical thinking skills – essential for any successful software engineer.</p>



<h3 class="wp-block-heading">Building a Strong Skill Set</h3>



<p>You&#8217;ll need to focus on building a robust skill set, encompassing both technical and soft skills, to stand out in the ever-competitive tech field.</p>



<p>I&#8217;m constantly updating my knowledge of programming languages, software design patterns, software architecture trends, and development tools. This technical prowess is indispensable, but I&#8217;m also honing my soft skills. Communication, problem-solving, and teamwork are just as critical. Participation in hackathons and coding competitions can test and grow these skills.</p>



<p>I&#8217;m also making a point to network, which is crucial in this industry.</p>



<p>You ensure your relevance and competitiveness in the tech field by continuously developing and diversifying your skill set.</p>



<h3 class="wp-block-heading">Gaining Practical Experience</h3>



<p>Practical experience in the tech field is the best way to learn new skills. This involves working on real-life projects, participating in coding challenges, and contributing to open-source platforms. These experiences will allow you to apply and refine the software engineering skills you&#8217;re learning.</p>



<p>Moreover, I&#8217;m considering internships and entry-level positions as a way of gaining industry experience. These roles offer a valuable chance to work closely with seasoned professionals, learn the ropes, and understand the dynamics of a tech work environment.</p>



<h3 class="wp-block-heading">Networking with Other Professionals</h3>



<p>Networking isn&#8217;t just about making connections; it&#8217;s also about sharing ideas, gaining insights, and cultivating meaningful relationships within the tech community. Attending conferences, webinars, and meetups exposes me to various perspectives and innovations. Furthermore, it&#8217;s an opportunity to learn from industry leaders and peers.</p>



<p>On platforms like LinkedIn and GitHub, you can actively engage in discussions, contribute to open-source projects, and share your work. This helps you stay updated with the latest trends and technologies and demonstrates your skills and knowledge to potential employers.</p>



<h2 class="wp-block-heading">How Do I Become a Software Engineer?</h2>



<figure class="wp-block-kadence-image kb-image3582_b45ca6-ba size-large"><a href="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Becoming-a-Software-Developer.png" class="kb-advanced-image-link"><img loading="lazy" decoding="async" width="1024" height="574" src="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Becoming-a-Software-Developer-1024x574.png" alt="An illustration of a young adult learning to be a software developer." class="kb-img wp-image-3620" srcset="https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Becoming-a-Software-Developer-1024x574.png 1024w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Becoming-a-Software-Developer-300x168.png 300w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Becoming-a-Software-Developer-768x430.png 768w, https://eranstiller.com/wp-content/uploads/2023/09/Software-Engineer-Skills-Becoming-a-Software-Developer.png 1456w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>You&#8217;re probably wondering what steps you&#8217;ll need to take to become a software engineer in the upcoming years. Here&#8217;s a breakdown of what you&#8217;ll need to do.</p>



<p>First things first, you&#8217;ve got to start with the basics. Learn a programming language like Python or JavaScript to understand variables, loops, and functions. From there, dive into data structures and algorithms—they&#8217;re your bread and butter, not just for interviews but also for being a competent coder.</p>



<p>Don&#8217;t just stick to theory; build small projects to apply your knowledge. Version control is a must, so get familiar with Git early on. As you get comfortable, explore frameworks, libraries, and databases like SQL.</p>



<p>Something they don&#8217;t always teach you in coding bootcamps or computer science classes are soft skills and networking. Communicating your ideas clearly and working well in a team is just as important as knowing how to code. Attend tech meetups and webinars, and engage in online forums to meet people in the field.</p>



<p>Your first software engineering job or internship is your entry ticket to real-world experience, so grab any opportunity that comes your way.</p>



<p>And remember, tech is ever-evolving, which means you should be, too. Keep learning, keep coding, and keep pushing your boundaries.</p>



<h2 class="wp-block-heading">Should I Improve My Soft Skills or My Technical Skills?</h2>



<p>A common dilemma is whether to focus on soft skills or technical skills. My advice? Don&#8217;t overlook either. You&#8217;ll need a solid balance of both for a successful career in software engineering.</p>



<p>Technical skills are your foundation. You&#8217;ll use them to build solutions, solve complex problems, and stay competitive.</p>



<p>Soft skills, on the other hand, enhance your ability to work collaboratively, communicate effectively, and adapt to changing environments.</p>



<h2 class="wp-block-heading">What Is the Most Valuable Skill for a Software Developer?</h2>



<p>It&#8217;s often debated, but the most valuable skill for a software developer isn&#8217;t necessarily a specific programming language or technology. Instead, it&#8217;s the ability to adapt and learn new technologies quickly. As technology evolves rapidly, being a quick learner is imperative.</p>



<p>It&#8217;s not enough to be an expert in one language or framework. The ability to pick up new ones as required is crucial. The tech industry is dynamic, and yesterday&#8217;s tools might not be relevant tomorrow.</p>



<p>This doesn&#8217;t mean I neglect my technical skills. I continually hone them, but I also ensure that I stay adaptable and ready to adopt new methodologies and technologies. That&#8217;s my secret to staying relevant in this ever-changing industry.</p>



<h2 class="wp-block-heading">Conclusion</h2>



<p>In closing, it&#8217;s clear that both soft and technical skills are crucial for software engineers. The most valuable skill? Adaptability and the ability to constantly learn new things, no doubt.</p>



<p>As for languages, it&#8217;s best to focus on one that aligns with your career goals.</p>



<p>So, keep learning, keep improving, and stay adaptable. That&#8217;s how you&#8217;ll thrive in 2023&#8217;s tech landscape.</p>
<p>The post <a rel="nofollow" href="https://eranstiller.com/software-engineer-skills">76 Best Software Engineer Skills to Learn in 2023: Level Up Your Career</a> appeared first on <a rel="nofollow" href="https://eranstiller.com">Eran Stiller</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://eranstiller.com/software-engineer-skills/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>12 Lessons From Running a Full-Day Online Conference</title>
		<link>https://eranstiller.com/12-lessons-from-running-a-full-day-online-conference</link>
					<comments>https://eranstiller.com/12-lessons-from-running-a-full-day-online-conference#respond</comments>
		
		<dc:creator><![CDATA[Eran Stiller]]></dc:creator>
		<pubDate>Tue, 28 Jul 2020 13:34:00 +0000</pubDate>
				<category><![CDATA[Personal]]></category>
		<guid isPermaLink="false">https://eranstiller.com/?p=2577</guid>

					<description><![CDATA[<p>Introduction The coronavirus pandemic has been with us for the past few months. Software conferences all over the world are either canceled, postponed, or moved online. I had three major conferences where I was supposed to speak, which got canceled. In addition to speaking at various conferences, I organized one major conference for the past...</p>
<p>The post <a rel="nofollow" href="https://eranstiller.com/12-lessons-from-running-a-full-day-online-conference">12 Lessons From Running a Full-Day Online Conference</a> appeared first on <a rel="nofollow" href="https://eranstiller.com">Eran Stiller</a>.</p>
]]></description>
										<content:encoded><![CDATA[


<h2 class="wp-block-heading">Introduction</h2>



<p>The coronavirus pandemic has been with us for the past few months. Software conferences all over the world are either canceled, postponed, or moved online. I had three major conferences where I was supposed to speak, which got canceled.</p>



<p>In addition to speaking at various conferences, I organized one major conference for the past couple of years —<a href="https://www.archnext.codevalue.com/" target="_blank" rel="noreferrer noopener">&nbsp;“Architecture Next.”</a>&nbsp;It ran the risk of cancellation as well. However, together with my colleagues, we decided to run the conference nonetheless, and move it from a physical setting to a virtual one.</p>



<p>Unlike organizing physical conferences and meetups, this was the first time I hosted an online conference. I knew we were sailing into uncharted territory for us. Nevertheless, in hindsight, we had a very successful conference with more than 1,100 registrants and more than 500 attendees and minimal technical glitches.</p>



<p>In my opinion, the most critical aspect of running this conference as smoothly as possible, was the meticulous planning that the team performed beforehand. That’s why I decided to write this article. Its purpose is to share with you what worked and what didn’t work at our conference to make your online conference experience go as well as possible. Online conferences are becoming the norm these days, and I don’t see them going anywhere anytime soon. So let’s get to it.</p>



<h2 class="wp-block-heading">The Content</h2>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="683" src="https://eranstiller.com/wp-content/uploads/2020/07/markus-spiske-KP1bubr2j4A-unsplash-1024x683.jpg" alt="" class="wp-image-2580" srcset="https://eranstiller.com/wp-content/uploads/2020/07/markus-spiske-KP1bubr2j4A-unsplash-1024x683.jpg 1024w, https://eranstiller.com/wp-content/uploads/2020/07/markus-spiske-KP1bubr2j4A-unsplash-300x200.jpg 300w, https://eranstiller.com/wp-content/uploads/2020/07/markus-spiske-KP1bubr2j4A-unsplash-768x512.jpg 768w, https://eranstiller.com/wp-content/uploads/2020/07/markus-spiske-KP1bubr2j4A-unsplash-1536x1024.jpg 1536w, https://eranstiller.com/wp-content/uploads/2020/07/markus-spiske-KP1bubr2j4A-unsplash-2048x1365.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>Photo by <a href="https://unsplash.com/@markusspiske?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" target="_blank" rel="noreferrer noopener">Markus Spiske</a> on <a href="https://unsplash.com/?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" target="_blank" rel="noreferrer noopener">Unsplash</a></figcaption></figure></div>



<p>“Content is king.”</p>



<p>This saying was true at the time of in-person conferences, and it’s just as accurate today. Any conference should have a vision and a target audience, and it should strive best to serve that audience via the selection of content.</p>



<p>At “Architecture Next,” our target audience was software architects and technical decision-makers such as tech leads, executives, etc. Our agenda is to focus on new and upcoming technologies and methods, and that was what we focused on during our Call for Speakers phase.</p>



<p>Without good content, it doesn’t matter how technically competent your conference is. Focus on your audience, get great speakers, and everything else should follow.</p>



<h2 class="wp-block-heading">Conference Structure</h2>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="683" src="https://eranstiller.com/wp-content/uploads/2020/07/robby-mccullough-csHCIiYXeVY-unsplash-1024x683.jpg" alt="" class="wp-image-2581" srcset="https://eranstiller.com/wp-content/uploads/2020/07/robby-mccullough-csHCIiYXeVY-unsplash-1024x683.jpg 1024w, https://eranstiller.com/wp-content/uploads/2020/07/robby-mccullough-csHCIiYXeVY-unsplash-300x200.jpg 300w, https://eranstiller.com/wp-content/uploads/2020/07/robby-mccullough-csHCIiYXeVY-unsplash-768x512.jpg 768w, https://eranstiller.com/wp-content/uploads/2020/07/robby-mccullough-csHCIiYXeVY-unsplash-1536x1024.jpg 1536w, https://eranstiller.com/wp-content/uploads/2020/07/robby-mccullough-csHCIiYXeVY-unsplash-2048x1365.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>Photo by <a href="https://unsplash.com/@mybbor?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" target="_blank" rel="noreferrer noopener">Robby McCullough</a> on <a href="https://unsplash.com/?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" target="_blank" rel="noreferrer noopener">Unsplash</a></figcaption></figure></div>



<p>When building the schedule, we faced the following question: should we split the conference to several consecutive days and hold each track separately? Or should we keep a single-day conference format with multiple parallel tracks?</p>



<p>Each of these approaches has its pros and cons. When you have a physical venue, each additional day can have high costs since you need to pay for the site, the food, etc. On the other hand, you can allow attendees to join more content as there are more available time slots. When attendees are arriving from afar, this makes a lot of sense. The additional per-day costs are suddenly gone when going virtual, so at first, it seems like having a multi-day conference is the better choice.</p>



<p>However, running a single-day conference with multiple tracks allows us to focus all the marketing effort on a single day. This way, you can get a lot of hype from the overwhelming amount of attendees joining at once. Also, since the conference is online, recording the sessions and making them available for your attendees later is much easier than doing it in a traditional session. Besides, our attendees could easily switch between concurrent tracks and get more value out of their time than if the conference was spread over multiple days.</p>



<p>Indeed, running multiple tracks concurrently on a single day is more technically challenging as it requires having more online moderators. However, I believe that the benefits far outweigh the challenges, and indeed our users seamlessly switched between channels the find the content that was best suited for them at any given timeslot.</p>



<h2 class="wp-block-heading">Session Length</h2>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="683" src="https://eranstiller.com/wp-content/uploads/2020/07/age-barros-rBPOfVqROzY-unsplash-1-1024x683.jpg" alt="" class="wp-image-2583" srcset="https://eranstiller.com/wp-content/uploads/2020/07/age-barros-rBPOfVqROzY-unsplash-1-1024x683.jpg 1024w, https://eranstiller.com/wp-content/uploads/2020/07/age-barros-rBPOfVqROzY-unsplash-1-300x200.jpg 300w, https://eranstiller.com/wp-content/uploads/2020/07/age-barros-rBPOfVqROzY-unsplash-1-768x512.jpg 768w, https://eranstiller.com/wp-content/uploads/2020/07/age-barros-rBPOfVqROzY-unsplash-1-1536x1024.jpg 1536w, https://eranstiller.com/wp-content/uploads/2020/07/age-barros-rBPOfVqROzY-unsplash-1-2048x1366.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>Photo by <a href="https://unsplash.com/@agebarros?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" target="_blank" rel="noreferrer noopener">Agê Barros</a> on <a href="https://unsplash.com/?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" target="_blank" rel="noreferrer noopener">Unsplash</a></figcaption></figure></div>



<p>In the past, most traditional conferences set the standard session length somewhere in the range of 45–75 minutes per session, with a 45 to 60-minute session probably being the most common format. At first, online conferences followed the same pattern.</p>



<p>Then, at&nbsp;<a href="https://mybuild.microsoft.com/" target="_blank" rel="noreferrer noopener">Microsoft Build</a>, Microsoft’s annual developer conference, which was virtual this year, tried something new. Each session was only 30 minutes long. Fifteen minutes of the time was devoted to a presentation, while the remaining time was comprised of Q&amp;A.</p>



<p>At first, I was quite skeptical of this format since there is a limit to the amount of technical content one can deliver in 15 minutes, but it worked! Sessions were kept short and focused, and it was a breeze watching so many sessions during a single day. In contrast, having an attendee focus on a presentation for 60–75 minutes in front of a screen is very hard, and many attendees will probably not make it to the end.</p>



<p>So what did we do for our schedule? We settled on the middle ground. Each session was 45 minutes long, followed by a 15-minute break. However, presenters were asked to limit their presentation to 35 minutes and allow ten more minutes for Q&amp;A. For most sessions, it worked well. The audience didn’t leave before a session was complete, and the Q&amp;A section was highly successful. In my opinion, with some sessions, the audience was more engaged than in regular in-person events. Perhaps the fear of publicly asking a question is slightly removed in an online setting.</p>



<p>My key highlight here is to keep the sessions focused (no more than 35–40 minutes), not including Q&amp;A, and always leave time for the audience to engage. This engagement is the main benefit that the audience has over watching the recorded session later on YouTube.</p>



<h2 class="wp-block-heading">Live vs. Recorded Content</h2>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="683" src="https://eranstiller.com/wp-content/uploads/2020/07/graydon-driver-ggZiK8G2WLY-unsplash-1-1024x683.jpg" alt="" class="wp-image-2585" srcset="https://eranstiller.com/wp-content/uploads/2020/07/graydon-driver-ggZiK8G2WLY-unsplash-1-1024x683.jpg 1024w, https://eranstiller.com/wp-content/uploads/2020/07/graydon-driver-ggZiK8G2WLY-unsplash-1-300x200.jpg 300w, https://eranstiller.com/wp-content/uploads/2020/07/graydon-driver-ggZiK8G2WLY-unsplash-1-768x512.jpg 768w, https://eranstiller.com/wp-content/uploads/2020/07/graydon-driver-ggZiK8G2WLY-unsplash-1-1536x1024.jpg 1536w, https://eranstiller.com/wp-content/uploads/2020/07/graydon-driver-ggZiK8G2WLY-unsplash-1-2048x1365.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>Photo by <a href="https://unsplash.com/@itakeaveragephotos?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" target="_blank" rel="noreferrer noopener">Graydon Driver</a> on <a href="https://unsplash.com/?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" target="_blank" rel="noreferrer noopener">Unsplash</a></figcaption></figure></div>



<p>The above point about audience engagement leads me to the next topic. One of the primary debates I see around online conferences is whether sessions should be recorded or streamed live. In my opinion, live streaming the session is a far superior choice. I reason that if the entire session is recorded, then the audience can just as well catch it on YouTube later or on some other video-on-demand platform that you offer. There is no motivation to join the session “live.”</p>



<p>When you live-stream the session, the audience feels more connected to the presenter even if members of it don’t directly engage using Q&amp;A or another mechanism. The mere fact that the presenter is currently devoting his or her time to the audience has a very positive effect on all attendees. It’s true that live sessions are more complicated and are more prone to technical errors; however, that’s part of the magic. As long as technical issues are kept at a minimum and the day progresses well, having live sessions is a huge win.</p>



<p>Even while live streaming, presenters can include recorded clips within their sessions. This is especially true for complex demos that have a high chance of going wrong when presented live. Since the sessions should be kept short anyway, recording complex demos can significantly reduce risk, while still maintaining the “live” aspect of the rest of the session.</p>



<p>If you still prefer playing recorded content, always leave a live intro into the content and a live Q&amp;A with the presenter at the end. In my view, this is the minimum one can do to thank the audience for attending. However, live streaming, in my opinion, is the best.</p>



<h2 class="wp-block-heading">The Platform</h2>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="768" src="https://eranstiller.com/wp-content/uploads/2020/07/ivan-nieto-tvqUpWqjAU4-unsplash-1-1024x768.jpg" alt="" class="wp-image-2587" srcset="https://eranstiller.com/wp-content/uploads/2020/07/ivan-nieto-tvqUpWqjAU4-unsplash-1-1024x768.jpg 1024w, https://eranstiller.com/wp-content/uploads/2020/07/ivan-nieto-tvqUpWqjAU4-unsplash-1-300x225.jpg 300w, https://eranstiller.com/wp-content/uploads/2020/07/ivan-nieto-tvqUpWqjAU4-unsplash-1-768x576.jpg 768w, https://eranstiller.com/wp-content/uploads/2020/07/ivan-nieto-tvqUpWqjAU4-unsplash-1-1536x1152.jpg 1536w, https://eranstiller.com/wp-content/uploads/2020/07/ivan-nieto-tvqUpWqjAU4-unsplash-1.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>Photo by <a href="https://unsplash.com/@inietop?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" target="_blank" rel="noreferrer noopener">Ivan Nieto</a> on <a href="https://unsplash.com/?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" target="_blank" rel="noreferrer noopener">Unsplash</a></figcaption></figure></div>



<p>After finalizing your strategy, the next step is to choose a broadcast platform. Here, you’ll have several options.</p>



<h3 class="wp-block-heading" id="2057">Video conference software</h3>



<p>You can use a conference call platform that allows all attendees to chat and show their audio and video, much like a regular online call. Examples include&nbsp;<a href="https://zoom.us/" target="_blank" rel="noreferrer noopener">Zoom</a>&nbsp;and&nbsp;<a href="https://www.microsoft.com/en/microsoft-365/microsoft-teams" target="_blank" rel="noreferrer noopener">Microsoft Teams</a>. This method is best suited for relatively small conferences where you want to get the community vibe.</p>



<p>The most significant advantage is that the audience feels more engaged than the other methods, and it has the most similar effect to an in-person gathering where everyone can see and be seen. However, this approach’s drawback is that you, as the organizer, have no control over who can unmute themselves or share a video feed, and you never know what they will present.</p>



<p>At an in-person event, there is only a small chance that an attendee will disrupt your event. Yet, at an online event, under cover of anonymity, the likelihood of such interruptions significantly increase, especially when a large crowd is present.</p>



<p>Since you want to keep your attendees safe from phenomena such as&nbsp;<a href="https://en.wikipedia.org/wiki/Zoombombing" target="_blank" rel="noreferrer noopener">Zoombombing</a>, using this type of interaction for an online conference can be challenging. But, this is an excellent tool for a smaller community meetup and the best replacement for in-person attendance.</p>



<h3 class="wp-block-heading" id="0f09">Online webinar software</h3>



<p>The next option is to use software meant for online webinars. These solutions can typically handle a more significant number of participants and provide the organizer with various options to control attendee permissions, thus eliminating the possibility of harassment by attendees.&nbsp;<a href="https://docs.microsoft.com/en-us/microsoftteams/teams-live-events/what-are-teams-live-events" target="_blank" rel="noreferrer noopener">Microsoft Teams Live Events</a>&nbsp;and&nbsp;<a href="https://zoom.us/webinar" target="_blank" rel="noreferrer noopener">Zoom Webinar</a>&nbsp;are two of the available options.</p>



<p>The downside to this solution is that typically the interaction becomes a one-to-many interaction instead of many-to-many. In this type of interaction, the audience members cannot communicate freely with each other and instead can only communicate with the host.</p>



<p>As a result, each attendee might feel “alone” in the app instead of having a community or large gathering vibe to it. If you choose this path, I highly recommend augmenting it with a solution for audience networking (see the “Audience Engagement” section below).</p>



<p>For “Architecture Next,” we chose to use&nbsp;<a href="https://www.gotomeeting.com/webinar" target="_blank" rel="noreferrer noopener">GoToWebinar</a>&nbsp;as our streaming platform due to others’ recommendations. In hindsight, we were pleased with the platform as it was relatively easy to operate, had only minor technical glitches during the day, and provided an overall good streaming experience.</p>



<h3 class="wp-block-heading" id="8f5e">Live streaming platform</h3>



<p>Another option is to use a public live streaming service such as YouTube, Facebook, or Twitch. Using this option eliminates much of the friction of joining a session, and some platforms, such as Twitch, allow a high degree of communication between attendees. However, using these platforms has the cost of reducing the connection that you, as the organizer, have with your attendees. For some conferences, it might be a valuable solution, though.</p>



<h2 class="wp-block-heading">No Registration Cap</h2>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="576" src="https://eranstiller.com/wp-content/uploads/2020/07/ludovic-charlet-CGWK6k2RduY-unsplash-1-1024x576.jpg" alt="" class="wp-image-2589" srcset="https://eranstiller.com/wp-content/uploads/2020/07/ludovic-charlet-CGWK6k2RduY-unsplash-1-1024x576.jpg 1024w, https://eranstiller.com/wp-content/uploads/2020/07/ludovic-charlet-CGWK6k2RduY-unsplash-1-300x169.jpg 300w, https://eranstiller.com/wp-content/uploads/2020/07/ludovic-charlet-CGWK6k2RduY-unsplash-1-768x432.jpg 768w, https://eranstiller.com/wp-content/uploads/2020/07/ludovic-charlet-CGWK6k2RduY-unsplash-1-1536x864.jpg 1536w, https://eranstiller.com/wp-content/uploads/2020/07/ludovic-charlet-CGWK6k2RduY-unsplash-1-2048x1152.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>Photo by <a href="https://unsplash.com/@ludo_photos?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" target="_blank" rel="noreferrer noopener">Ludovic Charlet</a> on <a href="https://unsplash.com/?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" target="_blank" rel="noreferrer noopener">Unsplash</a></figcaption></figure></div>



<p>When running an in-person event, you have a physical limit to the number of attendees — the session rooms’ sizes. However, one of the advantages of going virtual is that this limitation is no longer a barrier. You can accommodate any size of gathering! However, do note that there is a caveat here — the license of your streaming platform might impose some limits.</p>



<p>Often enough, to host more attendees, you need a more expensive license. If possible, defer the decision on which license to purchase as close to the event as possible, when you have more information regarding the expected attendance. For example, at “Architecture Next,” we waited until a week before choosing and buying the exact license we needed.</p>



<p>Don’t forget, though, that the number of attendees is much lower than the number of registrants free to attend events. So take it into account and plan accordingly. In my experience, typical attendance rates fluctuate between 20% and 50%, depending on geography and local culture.</p>



<h2 class="wp-block-heading">Hassle-Free Session Switching</h2>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="681" src="https://eranstiller.com/wp-content/uploads/2020/07/glenn-carstens-peters-EOQhsfFBhRk-unsplash-1-1024x681.jpg" alt="" class="wp-image-2591" srcset="https://eranstiller.com/wp-content/uploads/2020/07/glenn-carstens-peters-EOQhsfFBhRk-unsplash-1-1024x681.jpg 1024w, https://eranstiller.com/wp-content/uploads/2020/07/glenn-carstens-peters-EOQhsfFBhRk-unsplash-1-300x200.jpg 300w, https://eranstiller.com/wp-content/uploads/2020/07/glenn-carstens-peters-EOQhsfFBhRk-unsplash-1-768x511.jpg 768w, https://eranstiller.com/wp-content/uploads/2020/07/glenn-carstens-peters-EOQhsfFBhRk-unsplash-1-1536x1022.jpg 1536w, https://eranstiller.com/wp-content/uploads/2020/07/glenn-carstens-peters-EOQhsfFBhRk-unsplash-1-2048x1363.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>Photo by <a href="https://unsplash.com/@glenncarstenspeters?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" target="_blank" rel="noreferrer noopener">Glenn Carstens-Peters</a> on <a href="https://unsplash.com/?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" target="_blank" rel="noreferrer noopener">Unsplash</a></figcaption></figure></div>



<p>One of the critical aspects of running a successful online conference is reducing attendee dropout during the day. Several conferences that I participated in required their users to follow a different link for each session. That’s quite cumbersome. Think about it — if you just got your users to leave the room, they have one more barrier to rejoin, so why would they bother? Imagine that you would force your users to leave the room after each session in an in-person conference, even if their next session is right there. It makes little sense.</p>



<p>The solution we used was to run each track in its own continuous channel. This way, the three tracks acted as television channels, where users could flip between them. As long as users wanted to stay in a particular track (or room), they didn’t need to do anything. As a result, staying within the conference turned into a more comfortable choice to perform, thus reducing dropout.</p>



<h2 class="wp-block-heading">Moderate and Host Sessions</h2>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="576" src="https://eranstiller.com/wp-content/uploads/2020/07/sam-mcghee-KieCLNzKoBo-unsplash-1-1024x576.jpg" alt="" class="wp-image-2593" srcset="https://eranstiller.com/wp-content/uploads/2020/07/sam-mcghee-KieCLNzKoBo-unsplash-1-1024x576.jpg 1024w, https://eranstiller.com/wp-content/uploads/2020/07/sam-mcghee-KieCLNzKoBo-unsplash-1-300x169.jpg 300w, https://eranstiller.com/wp-content/uploads/2020/07/sam-mcghee-KieCLNzKoBo-unsplash-1-768x432.jpg 768w, https://eranstiller.com/wp-content/uploads/2020/07/sam-mcghee-KieCLNzKoBo-unsplash-1-1536x864.jpg 1536w, https://eranstiller.com/wp-content/uploads/2020/07/sam-mcghee-KieCLNzKoBo-unsplash-1-2048x1152.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>Photo by <a href="https://unsplash.com/@sammcghee?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" target="_blank" rel="noreferrer noopener">Sam McGhee</a> on <a href="https://unsplash.com/?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" target="_blank" rel="noreferrer noopener">Unsplash</a></figcaption></figure></div>



<p>It’s hard for presenters to follow the stream of questions from the audience as they come in. At “Architecture Next,” we had a host/moderator for each session. His/her job was to introduce the speaker, monitor the audience questions during the session (while answering some in the chat window if possible), and finally ask the most important questions at the end in an interview-like manner.</p>



<p>This audio conversation between the two captivates the crowd and makes them stay longer, as interviews are more engaging than a single person talking.</p>



<p>Having this format allows the audience to feel that they are part of the session, that their voices will be heard at the end, and gives them something to look forward to.</p>



<p>You should prefer that these moderators won’t have too much responsibility on their hands at the same time other than to moderate. For example, I moderated one of the tracks and spoke at other tracks and had overall responsibility for the conference, and it was very challenging.</p>



<h2 class="wp-block-heading">Preparing Questions</h2>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="683" src="https://eranstiller.com/wp-content/uploads/2020/07/emily-morter-8xAA0f9yQnE-unsplash-1-1024x683.jpg" alt="" class="wp-image-2595" srcset="https://eranstiller.com/wp-content/uploads/2020/07/emily-morter-8xAA0f9yQnE-unsplash-1-1024x683.jpg 1024w, https://eranstiller.com/wp-content/uploads/2020/07/emily-morter-8xAA0f9yQnE-unsplash-1-300x200.jpg 300w, https://eranstiller.com/wp-content/uploads/2020/07/emily-morter-8xAA0f9yQnE-unsplash-1-768x512.jpg 768w, https://eranstiller.com/wp-content/uploads/2020/07/emily-morter-8xAA0f9yQnE-unsplash-1-1536x1024.jpg 1536w, https://eranstiller.com/wp-content/uploads/2020/07/emily-morter-8xAA0f9yQnE-unsplash-1-2048x1365.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>Photo by <a href="https://unsplash.com/@emilymorter?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" target="_blank" rel="noreferrer noopener">Emily Morter</a> on <a href="https://unsplash.com/?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" target="_blank" rel="noreferrer noopener">Unsplash</a></figcaption></figure></div>



<p>There are only so many things that are more awkward than leaving ten minutes for Q&amp;A and not receiving a single question from the audience. If a session goes well and you have many attendees, you probably won’t have a problem. However, if you have fewer attendees or the session was less successful, awkward silence can occur.</p>



<p>My recommendation is to ask every presenter to send 3–5 questions about their session beforehand. These questions can then be used as a backup by the host if there is not enough audience participation. Starting with one “pre-made” question can even trigger additional “real” follow-up questions from the audience, and from there, you can continue as usual. Don’t give up on this. You’ll thank me later.</p>



<h2 class="wp-block-heading">Dry Runs</h2>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="684" src="https://eranstiller.com/wp-content/uploads/2020/07/jordan-sanchez-Vbzx-yy5FoA-unsplash-1-1024x684.jpg" alt="" class="wp-image-2597" srcset="https://eranstiller.com/wp-content/uploads/2020/07/jordan-sanchez-Vbzx-yy5FoA-unsplash-1-1024x684.jpg 1024w, https://eranstiller.com/wp-content/uploads/2020/07/jordan-sanchez-Vbzx-yy5FoA-unsplash-1-300x200.jpg 300w, https://eranstiller.com/wp-content/uploads/2020/07/jordan-sanchez-Vbzx-yy5FoA-unsplash-1-768x513.jpg 768w, https://eranstiller.com/wp-content/uploads/2020/07/jordan-sanchez-Vbzx-yy5FoA-unsplash-1-1536x1025.jpg 1536w, https://eranstiller.com/wp-content/uploads/2020/07/jordan-sanchez-Vbzx-yy5FoA-unsplash-1-2048x1367.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>Photo by <a href="https://unsplash.com/@jordaneil?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" target="_blank" rel="noreferrer noopener">Jordan Sanchez</a> on <a href="https://unsplash.com/?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" target="_blank" rel="noreferrer noopener">Unsplash</a></figcaption></figure></div>



<h3 class="wp-block-heading" id="296d">Content dry runs</h3>



<p>Practice makes perfect. If possible, have at least one dry run with each of your presenters. Even presenters that are accustomed to large in-person events may struggle with the online format. Feedback is always welcomed. These dry runs will be noticeable on the day of the event as the presentations themselves become more coherent and are timed to fit the allotted slot. All the presenters I had the honor of performing their dry runs had undoubtedly improved their performance.</p>



<p>Of course, this is not always possible with all speakers and events but is highly recommended, even for experienced speakers.</p>



<h3 class="wp-block-heading" id="1558">Technical dry runs</h3>



<p>Unless your speakers and moderators are well versed with the streaming platform you chose, having multiple dry runs where speakers can try it and get familiar with all the controls is crucial for avoiding technical glitches on the day of the event. If possible, have speakers connect to the platform and use the same hardware they’ll use for the event to reduce risk even further.</p>



<h2 class="wp-block-heading">Audio-Video Equipment</h2>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="768" src="https://eranstiller.com/wp-content/uploads/2020/07/obi-onyeador-9FwrfeM2XIY-unsplash-1-1024x768.jpg" alt="" class="wp-image-2599" srcset="https://eranstiller.com/wp-content/uploads/2020/07/obi-onyeador-9FwrfeM2XIY-unsplash-1-1024x768.jpg 1024w, https://eranstiller.com/wp-content/uploads/2020/07/obi-onyeador-9FwrfeM2XIY-unsplash-1-300x225.jpg 300w, https://eranstiller.com/wp-content/uploads/2020/07/obi-onyeador-9FwrfeM2XIY-unsplash-1-768x576.jpg 768w, https://eranstiller.com/wp-content/uploads/2020/07/obi-onyeador-9FwrfeM2XIY-unsplash-1-1536x1152.jpg 1536w, https://eranstiller.com/wp-content/uploads/2020/07/obi-onyeador-9FwrfeM2XIY-unsplash-1-2048x1536.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>Photo by <a href="https://unsplash.com/@thenewmalcolm?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" target="_blank" rel="noreferrer noopener">Obi Onyeador</a> on <a href="https://unsplash.com/?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" target="_blank" rel="noreferrer noopener">Unsplash</a></figcaption></figure></div>



<p>Never underestimate the importance of proper audio and video quality. Having a lousy stream reflects poorly on your conference, and might cause attendance to drop. Another culprit can be insufficient upload bandwidth from your presenters’ locations.</p>



<p>Check with your presenters regarding the type of equipment that they have and test it if required. You don’t need to buy radio quality audio equipment and invest a ton of money. Nevertheless, you should also avoid the built-in microphone on your laptop or webcam. A decent modern webcam and a good quality USB headset will take you a long way.</p>



<h2 class="wp-block-heading">Audience Engagement</h2>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="683" src="https://eranstiller.com/wp-content/uploads/2020/07/niclas-moser-6iK5U7OVZY8-unsplash-1-1024x683.jpg" alt="" class="wp-image-2601" srcset="https://eranstiller.com/wp-content/uploads/2020/07/niclas-moser-6iK5U7OVZY8-unsplash-1-1024x683.jpg 1024w, https://eranstiller.com/wp-content/uploads/2020/07/niclas-moser-6iK5U7OVZY8-unsplash-1-300x200.jpg 300w, https://eranstiller.com/wp-content/uploads/2020/07/niclas-moser-6iK5U7OVZY8-unsplash-1-768x512.jpg 768w, https://eranstiller.com/wp-content/uploads/2020/07/niclas-moser-6iK5U7OVZY8-unsplash-1-1536x1024.jpg 1536w, https://eranstiller.com/wp-content/uploads/2020/07/niclas-moser-6iK5U7OVZY8-unsplash-1-2048x1365.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>Photo by <a href="https://unsplash.com/@niclasmoser?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" target="_blank" rel="noreferrer noopener">Niclas Moser</a> on <a href="https://unsplash.com/?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" target="_blank" rel="noreferrer noopener">Unsplash</a></figcaption></figure></div>



<h3 class="wp-block-heading" id="6d07">Social networking</h3>



<p>One area where an online conference clearly lacks against its in-person counterpart is around audience engagement and networking. At an in-person event, there are various opportunities for the audience to get to know each other, talk to speakers 1-on-1, meet new friends, etc.</p>



<p>While this problem has not been solved yet, we tried to use&nbsp;<a href="https://discord.com/" target="_blank" rel="noreferrer noopener">Discord</a>&nbsp;for audience networking at our conference. Discord is a chat service that originated from the gaming world and is similar to&nbsp;<a href="https://slack.com/" target="_blank" rel="noreferrer noopener">Slack</a>. We chose to use Discord as it is less formal than Slack, and that’s the experience we wanted to give to our attendees. There is even a good server template to get you started.</p>



<p>We invited each attendee to join our Discord server, where attendees could converse with each other and discuss various items with the speakers who were also available on the platform for chats. We created a channel for every track, and at the request of the audience during the day, we even created a dedicated channel for job seekers and job openings. Overall, the experience was a successful one though there were two unresolved issues:</p>



<ol class="wp-block-list"><li>The Discord chat was not integrated with the streaming platform and required users to have two separate windows/tabs open in parallel. This requirement is not ideal and does not put audience engagement at the forefront.</li><li>Many of the target audience did not have a Discord account since they were not gamers, which acted as a barrier for entry. They also needed to learn how to use the platform. Slack might have been a better match since it is likely to assume that most of our target audience is already familiar with it.</li></ol>



<p>This issue is an item that we’ll have to consider for future conferences.</p>



<h3 class="wp-block-heading" id="2a99">Presenter breakout room</h3>



<p>For me, it looked like the ten minutes of Q&amp;A at the end of each session was often not enough, and we had to stop without answering all the questions. At an in-person conference, attendees can simply walk up to the stage and talk to the presenter, and they can even walk to the lounge where the discussion can continue. We didn’t have an equivalent experience for this. I think that we should have some sort of breakout room where interested members of the audience can have an audio-video chat with the presenter following the session. We’ll have to put more thought into this, and any ideas and suggestions would be welcomed.</p>



<h2 class="wp-block-heading" id="f59e">Conclusions</h2>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="768" src="https://eranstiller.com/wp-content/uploads/2020/07/20200707_082738-1024x768.jpg" alt="Eran Stiller preparing for Architecture Next 2020" class="wp-image-2552" srcset="https://eranstiller.com/wp-content/uploads/2020/07/20200707_082738-1024x768.jpg 1024w, https://eranstiller.com/wp-content/uploads/2020/07/20200707_082738-300x225.jpg 300w, https://eranstiller.com/wp-content/uploads/2020/07/20200707_082738-768x576.jpg 768w, https://eranstiller.com/wp-content/uploads/2020/07/20200707_082738-1536x1152.jpg 1536w, https://eranstiller.com/wp-content/uploads/2020/07/20200707_082738-2048x1536.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>Me directing the conference</figcaption></figure></div>



<p>Organizing community events is a lot of work. But it’s fun and it’s essential. Knowledge sharing is one of the most important things that we can do as professionals, and conferences are significant.</p>



<p>I hope that this article gives you some insight into what it’s like to organize an online conference. This conference was the first time I ever hosted such an event, and I hope that my learnings can serve others. If you have any additional thoughts, I welcome them in the comments below.</p>



<p>Will conferences remain virtual after we win the fight against coronavirus? Will online conferences become the new norm? What will I do for my next conference after COVID-19 is behind us? I don’t know yet, but I’m pretty sure that we’ll have a mix of both styles as every type of event has its advantages. One thing I know for sure is that nothing beats speaking to a large crowd, whether online or in-person. Thank you for reading, and see you at the next event.</p>
<p>The post <a rel="nofollow" href="https://eranstiller.com/12-lessons-from-running-a-full-day-online-conference">12 Lessons From Running a Full-Day Online Conference</a> appeared first on <a rel="nofollow" href="https://eranstiller.com">Eran Stiller</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://eranstiller.com/12-lessons-from-running-a-full-day-online-conference/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Build a Custom URL Shortener Using Azure Functions and Cosmos DB</title>
		<link>https://eranstiller.com/build-a-custom-url-shortener-using-azure-functions-and-cosmos-db</link>
					<comments>https://eranstiller.com/build-a-custom-url-shortener-using-azure-functions-and-cosmos-db#respond</comments>
		
		<dc:creator><![CDATA[Eran Stiller]]></dc:creator>
		<pubDate>Thu, 16 Jul 2020 07:24:00 +0000</pubDate>
				<category><![CDATA[Software Development]]></category>
		<guid isPermaLink="false">https://eranstiller.com/?p=2560</guid>

					<description><![CDATA[<p>Introduction This article describes how to build a custom URL shortener service using Azure’s serverless platform with Azure Functions and Cosmos DB. I had this idea after I recently read&#160;Jussi Roine’s article, where he built a URL shortener service (such as&#160;bit.ly) using a serverless Azure approach, an approach he led with&#160;Azure Logic Apps&#160;and a custom...</p>
<p>The post <a rel="nofollow" href="https://eranstiller.com/build-a-custom-url-shortener-using-azure-functions-and-cosmos-db">Build a Custom URL Shortener Using Azure Functions and Cosmos DB</a> appeared first on <a rel="nofollow" href="https://eranstiller.com">Eran Stiller</a>.</p>
]]></description>
										<content:encoded><![CDATA[


<h2 class="wp-block-heading" id="d7b8">Introduction</h2>



<p>This article describes how to build a custom URL shortener service using Azure’s serverless platform with Azure Functions and Cosmos DB. I had this idea after I recently read&nbsp;<a href="https://jussiroine.com/2020/07/building-a-custom-url-shortener-service-using-azure-and-a-serverless-approach/" target="_blank" rel="noreferrer noopener">Jussi Roine’s article</a>, where he built a URL shortener service (such as&nbsp;<a href="https://bitly.com/" target="_blank" rel="noreferrer noopener">bit.ly</a>) using a serverless Azure approach, an approach he led with&nbsp;<a href="https://azure.microsoft.com/en-us/services/logic-apps/" target="_blank" rel="noreferrer noopener">Azure Logic Apps</a>&nbsp;and a custom web app. As I was reading his article, I realized that building the same solution with&nbsp;<a href="https://azure.microsoft.com/en-us/services/functions/" target="_blank" rel="noreferrer noopener">Azure Functions</a>&nbsp;and proper use of input and output bindings, can yield a highly elegant solution. And so, I embarked on a journey to see just how smart can such a solution be.</p>



<p>I also wanted the solution to be ultra-scalable and achieve very low latencies in response to queries, so I chose to use&nbsp;<a href="https://azure.microsoft.com/en-us/services/cosmos-db/" target="_blank" rel="noreferrer noopener">Azure Cosmos DB</a>&nbsp;as the storage solution. Cosmos DB is Microsoft’s proprietary globally-distributed, multi-model database service. Cosmos DB guarantees less than 10-ms latencies for reads and writes at the 99th percentile, so it was a natural choice.</p>



<h2 class="wp-block-heading" id="880f">The Requirements</h2>



<p>The URL shortener service should have two endpoints:</p>



<ol class="wp-block-list"><li>A URL registration endpoint, which allows clients to register shortened URLs (often referred to as vanity URLs) with their redirection target.</li><li>A URL redirect endpoint, where web browsers can issue&nbsp;<code>GET</code>&nbsp;requests using the vanity domain and receive a redirect to the target URL.</li></ol>



<p>Also, as stated above, the service should possess the following runtime qualities:</p>



<ol class="wp-block-list"><li>Very low latency in response to redirect requests.</li><li>Ultra-scalable in terms of both request throughput and geographic scalability.</li><li>Relatively cheap to operate, with cost scaling together with request throughput.</li></ol>



<h2 class="wp-block-heading" id="82b2">The Solution</h2>



<p>To answer the above requirements, I decided to proceed with the following solution architecture.</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="371" src="https://eranstiller.com/wp-content/uploads/2020/07/URL-Shortener-1024x371.png" alt="" class="wp-image-2563" srcset="https://eranstiller.com/wp-content/uploads/2020/07/URL-Shortener-1024x371.png 1024w, https://eranstiller.com/wp-content/uploads/2020/07/URL-Shortener-300x109.png 300w, https://eranstiller.com/wp-content/uploads/2020/07/URL-Shortener-768x278.png 768w, https://eranstiller.com/wp-content/uploads/2020/07/URL-Shortener.png 1282w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>URL Shortener Architecture</figcaption></figure></div>



<p>Other than meeting the functional needs, this architecture is also aligned with the desired runtime qualities.</p>



<ol class="wp-block-list"><li>Cosmos DB&nbsp;<a href="https://docs.microsoft.com/en-us/azure/cosmos-db/introduction#guaranteed-low-latency-at-99th-percentile-worldwide" target="_blank" rel="noreferrer noopener">guarantees less than 10-ms latencies</a>&nbsp;for reads (indexed) and writes at the 99th percentile while allowing virtually unlimited throughput (with proper scaling). The only mechanism that can improve this latency is an in-memory cache such as&nbsp;<a href="https://redis.io/" target="_blank" rel="noreferrer noopener">Redis</a>&nbsp;(or&nbsp;<a href="https://azure.microsoft.com/en-us/services/cache/" target="_blank" rel="noreferrer noopener">Azure Cache for Redis</a>). However, it does require extra work since Redis alone cannot provide the desired persistence consistency. We can combine Redis as a cache mechanism and Cosmos DB for persistence to get the best of both worlds; however, that is out of scope for this article.</li><li>We can quickly deploy Cosmos DB in&nbsp;<a href="https://docs.microsoft.com/en-us/azure/cosmos-db/how-to-multi-master" target="_blank" rel="noreferrer noopener">multiple geographies</a>&nbsp;at a click of a button, scaling our data worldwide.</li><li>Azure Functions is a lightweight solution with minimal overhead. The only downside to Azure Functions (and virtually any serverless platform) is the&nbsp;<a href="https://azure.microsoft.com/en-us/blog/understanding-serverless-cold-start/" target="_blank" rel="noreferrer noopener">cold-start time</a>, which can be very long. However, Premium and Dedicated hosting plans solve this problem on Azure (at the cost of increased financial expense).</li><li>Both Cosmos DB and Azure Functions can start cheap, and grow in spending as the required throughput increases.</li></ol>



<h2 class="wp-block-heading" id="46f1">Cosmos DB</h2>



<p>To use Cosmos DB, you can either use the&nbsp;<a href="https://docs.microsoft.com/en-us/azure/cosmos-db/local-emulator" target="_blank" rel="noreferrer noopener">Cosmos DB emulator</a>&nbsp;(on Windows Only) or&nbsp;<a href="https://docs.microsoft.com/en-us/azure/cosmos-db/create-cosmosdb-resources-portal" target="_blank" rel="noreferrer noopener">create a Cosmos DB account on Azure</a>. Cosmos DB offers a free tier that is suitable for our URL shortener. Whichever path you choose, please take note of the Cosmos DB connection string as you’ll need it to configure the Azure Functions we’ll soon implement.</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="722" src="https://eranstiller.com/wp-content/uploads/2020/07/Cosmos-DB-Emulator-1024x722.png" alt="" class="wp-image-2564" srcset="https://eranstiller.com/wp-content/uploads/2020/07/Cosmos-DB-Emulator-1024x722.png 1024w, https://eranstiller.com/wp-content/uploads/2020/07/Cosmos-DB-Emulator-300x212.png 300w, https://eranstiller.com/wp-content/uploads/2020/07/Cosmos-DB-Emulator-768x542.png 768w, https://eranstiller.com/wp-content/uploads/2020/07/Cosmos-DB-Emulator.png 1414w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>Cosmos DB Emulator</figcaption></figure></div>



<h2 class="wp-block-heading" id="f037">Azure Functions</h2>



<h3 class="wp-block-heading" id="0aac">Creating the Functions App</h3>



<p>There are many ways to create an Azure Functions App, and there are multiple&nbsp;<a href="https://docs.microsoft.com/en-us/azure/azure-functions/supported-languages" target="_blank" rel="noreferrer noopener">supported languages</a>. For my implementation, I chose to use Node.js and JavaScript using Visual Studio Code. To bootstrap the app, you can follow the handy&nbsp;<a href="https://docs.microsoft.com/en-us/azure/azure-functions/functions-create-first-function-vs-code?pivots=programming-language-javascript" target="_blank" rel="noreferrer noopener">quickstart guide</a>. I used the following inputs in response to the VSCode extension prompts:</p>



<ul class="wp-block-list"><li>Language:&nbsp;<em>JavaScript</em></li><li>Template:&nbsp;<em>HTTP Trigger</em></li><li>Function name:&nbsp;<em>register</em></li><li>Authorization level:&nbsp;<em>anonymous&nbsp;</em>(this is great for demo purposes, but for production, you can use either a&nbsp;<a href="https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-http-webhook-trigger?tabs=csharp#authorization-keys" target="_blank" rel="noreferrer noopener">function key</a>&nbsp;or&nbsp;<a href="https://docs.microsoft.com/en-us/azure/app-service/overview-authentication-authorization" target="_blank" rel="noreferrer noopener">EasyAuth</a>)</li></ul>



<p>The extension should now create a basic “Hello World”-style Functions app named “register.” You can launch the app by either pressing F5 to debug the app or launching&nbsp;<code>npm start</code>&nbsp;from the terminal window. Both options should launch the Azure Functions runtime and allow you to test your app.</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="556" src="https://eranstiller.com/wp-content/uploads/2020/07/Initial-Workspace-1024x556.png" alt="" class="wp-image-2566" srcset="https://eranstiller.com/wp-content/uploads/2020/07/Initial-Workspace-1024x556.png 1024w, https://eranstiller.com/wp-content/uploads/2020/07/Initial-Workspace-300x163.png 300w, https://eranstiller.com/wp-content/uploads/2020/07/Initial-Workspace-768x417.png 768w, https://eranstiller.com/wp-content/uploads/2020/07/Initial-Workspace-1536x834.png 1536w, https://eranstiller.com/wp-content/uploads/2020/07/Initial-Workspace-2048x1112.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>Initial VS Code Workspace</figcaption></figure></div>



<p>You can test that the function is running properly by executing the following from the workspace’s root folder:</p>



<figure class="wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler"><div class="wp-block-embed__wrapper">
https://gist.github.com/estiller/fb825f6c4de4ee881e5ea7c3deee0415
</div></figure>



<p>Once everything works, you can delete the&nbsp;<code>sample.dat</code>&nbsp;file.</p>



<h3 class="wp-block-heading" id="eb5d">Configuring Cosmos DB</h3>



<p>To configure Cosmos DB, edit the&nbsp;<code>local.settings.json</code>&nbsp;file and add the following connection string:</p>



<figure class="wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler"><div class="wp-block-embed__wrapper">
https://gist.github.com/estiller/11b30c502fb7d973609f953144ac4a9e
</div></figure>



<p>The connection string in the snippet corresponds with the Cosmos DB emulator. If you created a Cosmos DB account in Azure instead, you should replace the connection string with the one available from the portal on your created Cosmos DB instance.</p>



<h3 class="wp-block-heading" id="758b">Customizing the Route Prefix</h3>



<p>By default, the Azure Functions runtime prefixes all HTTP trigger routes with&nbsp;<code>/api</code>. Since we want to keep the URL short (this is a URL&nbsp;<strong>shortener&nbsp;</strong>service…), we need to remove this prefix.</p>



<p>Fortunately, the prefix can be customized by editing the&nbsp;<code>host.json</code>&nbsp;file and adding the below configuration.</p>



<figure class="wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler"><div class="wp-block-embed__wrapper">
https://gist.github.com/estiller/78200f8d6f8cfb8093339a86373a3222
</div></figure>



<p>This configuration sets the default route prefix to an empty string, effectively removing it.</p>



<h3 class="wp-block-heading" id="0a92">Authoring the URL Registration Endpoint</h3>



<p>First, we’ll configure the function bindings in the&nbsp;<code>function.json</code>&nbsp;file as follows:</p>



<figure class="wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler"><div class="wp-block-embed__wrapper">
https://gist.github.com/estiller/e795ee7283402f1b8343e1bf5b786b6d
</div></figure>



<p>Let’s break this definition down to its components:</p>



<ol class="wp-block-list"><li>Lines 4–9 define the HTTP trigger. We’re defining a route that matches&nbsp;<code>POST</code>&nbsp;requests to the&nbsp;<code>/register</code>&nbsp;endpoint. The request is then made available on the&nbsp;<code>req</code>&nbsp;object.</li><li>Lines 12–14 define the HTTP response output, assigned from the return object’s property&nbsp;<code>res</code>.</li><li>Lines 17–25 are where it gets interesting. These lines define an output binding, which binds the return object’s property&nbsp;<code>registration</code>&nbsp;to a document in a Cosmos DB database collection. As a result, any object that our function assigns to the&nbsp;<code>registration</code>&nbsp;property is automatically placed into the DB without writing any Cosmos DB related code to do so. We will later use this document to redirect incoming requests. In addition, the binding defines that if the database or the collection do not exist, they will be created automatically for us. Pretty neat!</li></ol>



<p>Once all the bindings are in place, the function itself is very straightforward:</p>



<figure class="wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler"><div class="wp-block-embed__wrapper">
https://gist.github.com/estiller/6a6b87334c4e66882c891daac0bee526
</div></figure>



<p>We’re expecting a request body with two string properties —&nbsp;<code>url</code>&nbsp;and&nbsp;<code>vanity</code>. If these properties are present, we return a registration object (that gets output into the database via the binding) and a successful HTTP response. Otherwise, a&nbsp;<code>400 bad request</code>&nbsp;response is returned.</p>



<h3 class="wp-block-heading" id="15a6">Adding the URL Redirect Endpoint</h3>



<p>Once we have the vanity URL registrations in the DB, the final piece is about authoring the redirect logic itself. First, let’s look at the function bindings.</p>



<figure class="wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler"><div class="wp-block-embed__wrapper">
https://gist.github.com/estiller/0481311fa1a46fabc528be64baac2d6d
</div></figure>



<ol class="wp-block-list"><li>Lines 4–9 define the HTTP trigger. We’re setting a wildcard route that matches&nbsp;<code>GET</code>&nbsp;requests to&nbsp;<strong>any&nbsp;</strong>endpoint within the Functions App domain. We’re also capturing the route path in a variable named&nbsp;<code>vanity</code>, which we’ll use later. This section is where part of the magic is happening.</li><li>Lines 12–21 are where the magic continues. These lines define a Cosmos DB input binding, which, for each request, automatically fetches the document whose id is&nbsp;<code>vanity</code>. As you recall, this is a variable extracted from the request path, and it matches the identifier used by the output binding in the&nbsp;<code>register</code>&nbsp;function. So, a registration with the vanity URL&nbsp;<code>myvanity</code>&nbsp;generates a document with the id&nbsp;<code>myvanity</code>, which is output into the database. When the redirect is requested by performing a&nbsp;<code>GET&nbsp;</code>on&nbsp;<code>http://domain/myvanity</code>&nbsp;the same document is fetched from the DB, and the function can redirect to it. Sweet and elegant, in my opinion.</li><li>Lines 24–26 simply define the HTTP output property name.</li></ol>



<p>Once the bindings are in place, the code itself is also straightforward:</p>



<figure class="wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler"><div class="wp-block-embed__wrapper">
https://gist.github.com/estiller/6e46fe04970161aadde22789ce973765
</div></figure>



<p>If a matching document was found in the database, then redirection is sent. Otherwise, a&nbsp;<code>404 Not Found</code>&nbsp;error is returned.</p>



<h2 class="wp-block-heading" id="184f">Testing the Solution</h2>



<p>To test the registration process, you can issue the following commands:</p>



<figure class="wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler"><div class="wp-block-embed__wrapper">
https://gist.github.com/estiller/1b7dab59bc8d2628eadd03610c1384cf
</div></figure>



<p>Make sure you get a successful <code>204 No Content</code> response after registration, and a <code>302 Found</code> in response to the vanity URL request.</p>



<h2 class="wp-block-heading" id="05fb">Conclusion</h2>



<p>Serverless platforms provide a comfortable mechanism for implementing simple APIs in an easy, cost-effective manner. Smartly using Azure Functions bindings allows us to achieve a high degree of sophistication while keeping the binding specific code we need to write to a minimum. Cosmos DB completes the solution as an easy-to-use yet powerful document database platform. Together, we saw how we could utilize these platforms to implement a custom URL shortener service elegantly.</p>



<h2 class="wp-block-heading" id="df55">Resources</h2>



<p>Here are additional resources:</p>



<ul class="wp-block-list"><li><a href="https://github.com/estiller/azure-functions-url-shortener" target="_blank" rel="noreferrer noopener">Sample source code</a></li><li><a href="https://docs.microsoft.com/en-us/azure/azure-functions/functions-reference-node" target="_blank" rel="noreferrer noopener">Azure Functions JavaScript developer guide</a></li><li><a href="https://docs.microsoft.com/en-us/azure/azure-functions/functions-create-first-function-vs-code" target="_blank" rel="noreferrer noopener">Quickstart: Create a function in Azure using Visual Studio Code</a></li><li><a href="https://docs.microsoft.com/en-us/azure/azure-functions/functions-triggers-bindings" target="_blank" rel="noreferrer noopener">Azure Functions triggers and bindings concepts</a></li></ul>
<p>The post <a rel="nofollow" href="https://eranstiller.com/build-a-custom-url-shortener-using-azure-functions-and-cosmos-db">Build a Custom URL Shortener Using Azure Functions and Cosmos DB</a> appeared first on <a rel="nofollow" href="https://eranstiller.com">Eran Stiller</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://eranstiller.com/build-a-custom-url-shortener-using-azure-functions-and-cosmos-db/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Being a CTO, Professional Growth and Public Speaking</title>
		<link>https://eranstiller.com/being-a-cto-professional-growth-and-public-speaking</link>
					<comments>https://eranstiller.com/being-a-cto-professional-growth-and-public-speaking#respond</comments>
		
		<dc:creator><![CDATA[Eran Stiller]]></dc:creator>
		<pubDate>Tue, 28 Jan 2020 12:48:51 +0000</pubDate>
				<category><![CDATA[Personal]]></category>
		<guid isPermaLink="false">https://eranstiller.com/?p=2426</guid>

					<description><![CDATA[<p>The Role of the CTO For the past several years, I served as the CTO of CodeValue, a software services company based in Israel. I always keep asking myself &#8211; what is the role of a CTO in a software services company? After all, in traditional software services companies, the &#8220;product&#8221; is&#160;the person. Customers pay...</p>
<p>The post <a rel="nofollow" href="https://eranstiller.com/being-a-cto-professional-growth-and-public-speaking">Being a CTO, Professional Growth and Public Speaking</a> appeared first on <a rel="nofollow" href="https://eranstiller.com">Eran Stiller</a>.</p>
]]></description>
										<content:encoded><![CDATA[


<h2 class="wp-block-heading">The Role of the CTO</h2>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="576" src="https://eranstiller.com/wp-content/uploads/2020/01/alfred-aloushy-Ow-joAY8NyY-unsplash-1024x576.jpg" alt="A CTO staring at the horizon" class="wp-image-2437" srcset="https://eranstiller.com/wp-content/uploads/2020/01/alfred-aloushy-Ow-joAY8NyY-unsplash-1024x576.jpg 1024w, https://eranstiller.com/wp-content/uploads/2020/01/alfred-aloushy-Ow-joAY8NyY-unsplash-300x169.jpg 300w, https://eranstiller.com/wp-content/uploads/2020/01/alfred-aloushy-Ow-joAY8NyY-unsplash-768x432.jpg 768w, https://eranstiller.com/wp-content/uploads/2020/01/alfred-aloushy-Ow-joAY8NyY-unsplash-1536x864.jpg 1536w, https://eranstiller.com/wp-content/uploads/2020/01/alfred-aloushy-Ow-joAY8NyY-unsplash-2048x1152.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption> Photo by&nbsp;<a href="https://unsplash.com/@musickid98?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" target="_blank" rel="noreferrer noopener" aria-label=" (opens in a new tab)">Alfred Aloushy</a>&nbsp;on&nbsp;<a href="https://unsplash.com/s/photos/leadership?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" target="_blank" rel="noreferrer noopener" aria-label=" (opens in a new tab)">Unsplash</a> </figcaption></figure></div>



<p>For the past several years, I served as the CTO of <a href="https://codevalue.com" target="_blank" rel="noreferrer noopener" aria-label="CodeValue (opens in a new tab)">CodeValue</a>, a software services company based in Israel. I always keep asking myself &#8211; what is the role of a CTO in a software services company? After all, in traditional software services companies, the &#8220;product&#8221; is&nbsp;<strong>the person</strong>. Customers pay for the services of these software professionals. However, at CodeValue, we pride ourselves on not being a &#8220;standard&#8221; software services company. We value our employees, and we firmly believe that empowering them will eventually help us do a better job. If we look at the Wikipedia definition of a CTO we read that: </p>



<blockquote class="wp-block-quote is-style-default is-layout-flow wp-block-quote-is-layout-flow"><p>CTOs will make decisions for the overarching technology infrastructure that closely align with the organization&#8217;s goals&#8230; A CTO should be aware of new and existing technologies to guide the company’s future endeavors.&nbsp;The attributes of the roles a CTO holds vary from one company to the next, mainly depending on their organizational structure.</p><cite><a href="https://en.wikipedia.org/wiki/Chief_technology_officer" target="_blank" rel="noreferrer noopener" aria-label="Wikipedia (opens in a new tab)">Wikipedia</a></cite></blockquote>



<p>Typically, a software services company has limited technology infrastructure. Consequently, I believe that one of the primary roles of the CTO in a software services company is to carefully align the technical knowledge of the employees to the needs of the customers. This alignment, in turn, increases the business value that we provide to our customers and, as a result, the value of the company itself. However, when I look at it with a broader perspective, I believe that a CTO should not&nbsp;<em>only</em>&nbsp;increase the technical knowledge of an employee. He/she should also increase the overall competence of that employee. Which brings up another question &#8211; how can I increase the overall professional expertise of my employees at CodeValue? How can I contribute to their professional growth? </p>



<h2 class="wp-block-heading">Professional Career Growth</h2>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="683" src="https://eranstiller.com/wp-content/uploads/2020/01/stanislav-kondratiev-MdexOj4D-MU-unsplash-1024x683.jpg" alt="A plant growing" class="wp-image-2439" srcset="https://eranstiller.com/wp-content/uploads/2020/01/stanislav-kondratiev-MdexOj4D-MU-unsplash-1024x683.jpg 1024w, https://eranstiller.com/wp-content/uploads/2020/01/stanislav-kondratiev-MdexOj4D-MU-unsplash-300x200.jpg 300w, https://eranstiller.com/wp-content/uploads/2020/01/stanislav-kondratiev-MdexOj4D-MU-unsplash-768x512.jpg 768w, https://eranstiller.com/wp-content/uploads/2020/01/stanislav-kondratiev-MdexOj4D-MU-unsplash-1536x1024.jpg 1536w, https://eranstiller.com/wp-content/uploads/2020/01/stanislav-kondratiev-MdexOj4D-MU-unsplash-2048x1365.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption> Photo by&nbsp;<a href="https://unsplash.com/@technobulka?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" target="_blank" rel="noreferrer noopener" aria-label=" (opens in a new tab)">Stanislav Kondratiev</a>&nbsp;on&nbsp;<a href="https://unsplash.com/s/photos/growth?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" target="_blank" rel="noreferrer noopener" aria-label=" (opens in a new tab)">Unsplash</a> </figcaption></figure></div>



<p>I believe that a software professional has three main paths that they can grow in professionally:</p>



<ol class="wp-block-list"><li><strong>Become a Senior Developer.</strong>&nbsp;Learn new technologies, platforms, and stacks. Go in-depth with some of them. Pick-up on best practices and become a mentor to your fellow developers. A developer can accomplish this via a combination of professional training and experience.</li><li><strong>Become a Software Architect or Technical Lead.</strong>&nbsp;Focus on the big picture. Plan how to build complex solutions effectively and efficiently together with your team. Technologically lead your peers into the pit of success. Again, this is usually via a combination of professional training, mentorship by another architect and experience.</li><li><strong>Become a Team Leader or R&amp;D Manager.</strong>&nbsp;Focus on managing your team and guiding them to the destination in the best way possible. Do this while maintaining team morale and keeping work within time &amp; budget.</li></ol>



<p>Note that the above paths are not alternatives, and they do not contradict each other. Each software professional can choose which tracks to focus on during their advancement in life. What all of them have in common is that they focus on technical excellence, and they directly relate to the software professional&#8217;s work. However, there is one more path. A fourth path. A road less taken. The path of Public Speaking!</p>



<h2 class="wp-block-heading">Public Speaking</h2>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="640" src="https://eranstiller.com/wp-content/uploads/2019/11/73208169_2552317008322839_4548997345789870080_o-1-1024x640.jpg" alt="Eran Stiller on stage at .NET Fest 2019" class="wp-image-2089" srcset="https://eranstiller.com/wp-content/uploads/2019/11/73208169_2552317008322839_4548997345789870080_o-1-1024x640.jpg 1024w, https://eranstiller.com/wp-content/uploads/2019/11/73208169_2552317008322839_4548997345789870080_o-1-300x188.jpg 300w, https://eranstiller.com/wp-content/uploads/2019/11/73208169_2552317008322839_4548997345789870080_o-1-768x480.jpg 768w, https://eranstiller.com/wp-content/uploads/2019/11/73208169_2552317008322839_4548997345789870080_o-1-1536x960.jpg 1536w, https://eranstiller.com/wp-content/uploads/2019/11/73208169_2552317008322839_4548997345789870080_o-1-640x400.jpg 640w, https://eranstiller.com/wp-content/uploads/2019/11/73208169_2552317008322839_4548997345789870080_o-1-368x230.jpg 368w, https://eranstiller.com/wp-content/uploads/2019/11/73208169_2552317008322839_4548997345789870080_o-1.jpg 2000w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>Me on stage at <a href="https://eranstiller.com/portfolio/net-fest-2019/">.NET Fest 2019</a></figcaption></figure></div>



<p>Many software professionals do not take into account the gain they could achieve by becoming a public speaker. When I say &#8220;Public Speaking&#8221; I don&#8217;t necessarily mean only giving talks at various events and meetups. I also refer to writing blog posts, creating online videos, producing podcasts, being active on Twitter, etc. Any initiative which lets one influence an audience and help that audience by sharing knowledge. I honestly believe that becoming a public speaker can help you become a better software professional, in addition to the added benefit of helping others along the way. I started&nbsp;<a href="https://eranstiller.com/public-speaking/">public speaking</a>&nbsp;more than 15 years ago, and I believe that in large part, this act helped me get to where I am today &#8211; technologically leading a company with more than 150 employees.</p>



<p>Since I recognize the importance of public speaking, I took it upon myself as a mission to help others with advancing in this world and being their mentor. I often worked closely together with individuals helping them choose a topic for their session, editing the abstract together, reviewing the slide deck, and so on. About a year ago it occurred to me that while I love doing this, it only helps one person at a time. In addition, some individuals need more support than that and working with them 1-on-1 might not be the best way to start. That&#8217;s when I started thinking along the lines of conducting a public speaking workshop.</p>



<h2 class="wp-block-heading">Public Speaking Workshop</h2>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="768" src="https://eranstiller.com/wp-content/uploads/2020/01/20200107_220432-1024x768.jpg" alt="CodeValue employees graduating our Public Speaking Workshop" class="wp-image-2428" srcset="https://eranstiller.com/wp-content/uploads/2020/01/20200107_220432-1024x768.jpg 1024w, https://eranstiller.com/wp-content/uploads/2020/01/20200107_220432-300x225.jpg 300w, https://eranstiller.com/wp-content/uploads/2020/01/20200107_220432-768x576.jpg 768w, https://eranstiller.com/wp-content/uploads/2020/01/20200107_220432-1536x1152.jpg 1536w, https://eranstiller.com/wp-content/uploads/2020/01/20200107_220432-2048x1536.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>CodeValue employees graduating our Public Speaking Workshop</figcaption></figure></div>



<p>I am well aware that there are various such workshops out there. I even had the chance to participate in some of them, which were excellent. However, I wanted something that would pass along &#8220;my way&#8221; and the &#8220;CodeValue way&#8221;; and so we created our very own Public Speaking Workshop. Together with&nbsp;<a target="_blank" href="https://www.linkedin.com/in/ilana-glotman-1752761a/" rel="noreferrer noopener">Ilana Glotman</a>, CodeValue&#8217;s VP HR, we built a workshop intended to improve developers&#8217; public speaking abilities, whether they are beginners or experienced speakers, and take them to the next level. While the workshop itself was great (and I might write about its content and structure in a future post), the feedback we got was the most overwhelming part. The feedback was amazing! While this feedback has various reasons, there are specifically two that I would like to emphasize:</p>



<ol class="wp-block-list"><li><strong>We cared</strong>. When you care about your employees, it shows. When you invest in them, and they gain value out of it, they are willing to invest back. And boy, I can tell you &#8211; they sure did invest their heart in getting all their presentation sessions ready.</li><li><strong>It was custom made</strong>. We tailored the workshop to match the profile of how we see a technological public speaker, and this caused the effectiveness of the workshop to skyrocket.</li></ol>



<h2 class="wp-block-heading">Final Words</h2>



<p>As the CTO, or as any technical manager, you should care about your employees, and you should invest in them as much as possible. However, don&#8217;t invest only in direct professional education. Keep in mind that investing in soft skills in general and public speaking, in particular, really pays off in the long run and is much appreciated. So get them to speak up, and enjoy the reward.</p>
<p>The post <a rel="nofollow" href="https://eranstiller.com/being-a-cto-professional-growth-and-public-speaking">Being a CTO, Professional Growth and Public Speaking</a> appeared first on <a rel="nofollow" href="https://eranstiller.com">Eran Stiller</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://eranstiller.com/being-a-cto-professional-growth-and-public-speaking/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Boost Your Career with Cloud Computing</title>
		<link>https://eranstiller.com/boost-your-career-with-cloud-computing</link>
					<comments>https://eranstiller.com/boost-your-career-with-cloud-computing#respond</comments>
		
		<dc:creator><![CDATA[Eran Stiller]]></dc:creator>
		<pubDate>Mon, 08 Jul 2019 05:40:43 +0000</pubDate>
				<category><![CDATA[Personal]]></category>
		<guid isPermaLink="false">https://eranstiller.com/?p=1981</guid>

					<description><![CDATA[<p>The cloud is the modern platform which drives the entire industry forward and has the power to transform one's career. Lately I had the privilege of speaking at an event about how developers and IT professionals can grow their career by getting more into cloud computing. </p>
<p>The post <a rel="nofollow" href="https://eranstiller.com/boost-your-career-with-cloud-computing">Boost Your Career with Cloud Computing</a> appeared first on <a rel="nofollow" href="https://eranstiller.com">Eran Stiller</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">Can You Talk About Yourself?</h2>



<p>A couple of weeks ago I had the privilege to <a href="https://eranstiller.com/portfolio/boost-yourself-career-in-cloud-computing">speak</a> in a setting which was unfamiliar to me. Usually I speak about professional topics &#8211; Software Architecture, Cloud Computing, etc., but this time it was different. This time I was asked to speak about <strong>myself</strong>. A good friend of mine told me that he was organizing an event about how developers and IT professionals can grow their career by getting more into cloud computing. He asked me if I can talk about why is it important to understand the cloud, and how I personally got into the field. While I&#8217;m not usually the person who likes to speak about himself, I believed that the cause was crucial &#8211; getting more developers and IT pros to be familiar with the cloud. The cloud is the modern platform which drives the entire industry forward and has the power to transform one&#8217;s career. So&#8230;</p>


<div class="wp-block-image">
<figure class="aligncenter is-resized"><img loading="lazy" decoding="async" src="https://eranstiller.com/wp-content/uploads/2019/07/Challenge-Accepted.jpg" alt="Challenge Accepted" class="wp-image-1986" width="288" height="288" srcset="https://eranstiller.com/wp-content/uploads/2019/07/Challenge-Accepted.jpg 500w, https://eranstiller.com/wp-content/uploads/2019/07/Challenge-Accepted-300x300.jpg 300w, https://eranstiller.com/wp-content/uploads/2019/07/Challenge-Accepted-150x150.jpg 150w, https://eranstiller.com/wp-content/uploads/2019/07/Challenge-Accepted-400x400.jpg 400w, https://eranstiller.com/wp-content/uploads/2019/07/Challenge-Accepted-230x230.jpg 230w, https://eranstiller.com/wp-content/uploads/2019/07/Challenge-Accepted-415x415.jpg 415w, https://eranstiller.com/wp-content/uploads/2019/07/Challenge-Accepted-100x100.jpg 100w" sizes="auto, (max-width: 288px) 100vw, 288px" /><figcaption class="wp-element-caption">Challenge Accepted!</figcaption></figure>
</div>


<h2 class="wp-block-heading">What Is the Cloud?</h2>



<h3 class="wp-block-heading">Someone Else&#8217;s Big Machine</h3>



<p>Basically, the cloud can be seen as someone else&#8217;s big machine. You input your credit card number, and you get a whole lot of compute, storage and networking capacity without having to manage the intricate details of building and maintaining a data center yourself. However, this is a rather simplified point of view; the cloud offers much more than simple Virtual Machines for those who seek to take advantage of it. Services like Serverless Compute, Database-as-a-Service (DaaS), Machine Learning as a Service and others rapidly change the way we build systems. These service are making the process much easier and faster on the one hand but much more complex on the other, with complexity rising from one day to the other as new services are introduced. This leads me to the next analogy&#8230;</p>



<h3 class="wp-block-heading">The Cloud as Big Pile of Lego Bricks</h3>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="1024" height="394" src="https://eranstiller.com/wp-content/uploads/2019/07/lego-3388163-1024x394.png" alt="Pile of Lego Bricks" class="wp-image-1993" srcset="https://eranstiller.com/wp-content/uploads/2019/07/lego-3388163-1024x394.png 1024w, https://eranstiller.com/wp-content/uploads/2019/07/lego-3388163-300x115.png 300w, https://eranstiller.com/wp-content/uploads/2019/07/lego-3388163-768x296.png 768w, https://eranstiller.com/wp-content/uploads/2019/07/lego-3388163-1536x591.png 1536w, https://eranstiller.com/wp-content/uploads/2019/07/lego-3388163-2048x788.png 2048w, https://eranstiller.com/wp-content/uploads/2019/07/lego-3388163-880x339.png 880w, https://eranstiller.com/wp-content/uploads/2019/07/lego-3388163-420x162.png 420w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Photo by <a rel="noreferrer noopener" aria-label=" (opens in a new tab)" href="https://pixabay.com/users/painter06-3732158/" target="_blank">Francis Ray</a></figcaption></figure>
</div>


<p>I like to view the cloud as a pile of Lego bricks; each brick has it&#8217;s own shape and color and you connect the bricks in various ways to create new creations. This is the job of the software architect and I find it as one of the most enjoyable aspects of my work. Lets say, for example, that you want to build a &#8220;standard&#8221; web application consisting of a modern SPA front-end, a back-end API and a relational database. Before the modern cloud you had to think (among other things) about how to host the application, how to scale it, how to support disaster recovery (DR), how to update the host OS, etc.. </p>



<p>With the cloud, you focus on your own application code and use the appropriate bricks to handle the other concerns. In our example, we can use a BLOB store for the SPA, some Serverless platform for the API and a DaaS for the DB. These services all provide inherent solutions for scale, DR, infrastructure maintenance &#8211; so that you won&#8217;t have to come up with a solution yourself. You need to keep in mind, though, that these services come with their own bag of concerns and issues that we need to deal with &#8211; but who said that building Lego art is an easy thing. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<h2 class="wp-block-heading">Why Is the Cloud a Big Deal?</h2>



<h3 class="wp-block-heading">Speed</h3>



<p>When I teach Cloud Computing to developers and IT pros, I often ask them the following question &#8211; &#8220;At you company, how long does it take from the moment you need a compute resource and until you finally get it?&#8221;. The answers I get for this question are varied. Some quote times of up to a day. Others mention several days. However, some participants always quote an answer in the range of months. <strong>Months</strong>! Imagine yourself in an environment where it can take days to months to receive a required compute resource? At companies which do not utilize the cloud, this can often be the case. This, in turn, leads to reduced productive and lower developer happiness overall.</p>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="1024" height="519" src="https://eranstiller.com/wp-content/uploads/2019/07/lights-1577471-1024x519.jpg" alt="The speed of the cloud" class="wp-image-2009" srcset="https://eranstiller.com/wp-content/uploads/2019/07/lights-1577471-1024x519.jpg 1024w, https://eranstiller.com/wp-content/uploads/2019/07/lights-1577471-300x152.jpg 300w, https://eranstiller.com/wp-content/uploads/2019/07/lights-1577471-768x389.jpg 768w, https://eranstiller.com/wp-content/uploads/2019/07/lights-1577471-1536x778.jpg 1536w, https://eranstiller.com/wp-content/uploads/2019/07/lights-1577471-2048x1038.jpg 2048w, https://eranstiller.com/wp-content/uploads/2019/07/lights-1577471-789x400.jpg 789w, https://eranstiller.com/wp-content/uploads/2019/07/lights-1577471-420x214.jpg 420w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Photo by <a href="https://pixabay.com/users/stain_marylight-1253514/" target="_blank" rel="noreferrer noopener" aria-label="Stain_Marylight (opens in a new tab)">Stain_Marylight</a> </figcaption></figure>
</div>


<p>Enter the cloud. In the cloud, the need for a compute resource translates to an actual compute resource within minutes. Not months, not days, but <strong>minutes</strong> with a click of a button or script execution. The world will never be the same again&#8230;</p>



<h3 class="wp-block-heading">Scale</h3>



<p>Serving you application to millions of users around the globe is not an easy task; neither from the software perspective nor from the infrastructure point-of-view. Unless your business is building data centers, managing and maintaining huge data centers is probably not your specialty or your company&#8217;s specialty.</p>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="1024" height="681" src="https://eranstiller.com/wp-content/uploads/2019/07/scale-stock-4275796-1024x681.jpg" alt="" class="wp-image-2011" srcset="https://eranstiller.com/wp-content/uploads/2019/07/scale-stock-4275796-1024x681.jpg 1024w, https://eranstiller.com/wp-content/uploads/2019/07/scale-stock-4275796-300x200.jpg 300w, https://eranstiller.com/wp-content/uploads/2019/07/scale-stock-4275796-768x511.jpg 768w, https://eranstiller.com/wp-content/uploads/2019/07/scale-stock-4275796-1536x1022.jpg 1536w, https://eranstiller.com/wp-content/uploads/2019/07/scale-stock-4275796-2048x1363.jpg 2048w, https://eranstiller.com/wp-content/uploads/2019/07/scale-stock-4275796-601x400.jpg 601w, https://eranstiller.com/wp-content/uploads/2019/07/scale-stock-4275796-346x230.jpg 346w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Photo by <a href="https://pixabay.com/users/tama66-1032521/" target="_blank" rel="noreferrer noopener" aria-label="Peter H (opens in a new tab)">Peter H</a></figcaption></figure>
</div>


<p>Using the cloud, you can achieve high scale with (again) a click of a button. When I say &#8220;scale&#8221; I refer to it in terms of both compute power and geographic scale. Of course, scaling the applications to cover multiple geographies and millions of users is still complex on the software level. But at least with the cloud you can focus on your own business instead if the infrastructure running it and that is a power multiplier for any business.</p>



<h3 class="wp-block-heading">Economics</h3>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="1024" height="724" src="https://eranstiller.com/wp-content/uploads/2019/07/entrepreneur-1340649-1024x724.jpg" alt="Cloud Economics" class="wp-image-2000" srcset="https://eranstiller.com/wp-content/uploads/2019/07/entrepreneur-1340649-1024x724.jpg 1024w, https://eranstiller.com/wp-content/uploads/2019/07/entrepreneur-1340649-300x212.jpg 300w, https://eranstiller.com/wp-content/uploads/2019/07/entrepreneur-1340649-768x543.jpg 768w, https://eranstiller.com/wp-content/uploads/2019/07/entrepreneur-1340649-1536x1086.jpg 1536w, https://eranstiller.com/wp-content/uploads/2019/07/entrepreneur-1340649-2048x1448.jpg 2048w, https://eranstiller.com/wp-content/uploads/2019/07/entrepreneur-1340649-566x400.jpg 566w, https://eranstiller.com/wp-content/uploads/2019/07/entrepreneur-1340649-325x230.jpg 325w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Photo by <a href="https://pixabay.com/users/geralt-9301/" target="_blank" rel="noreferrer noopener" aria-label="Gerd Altmann (opens in a new tab)">Gerd Altmann</a></figcaption></figure>
</div>


<p>Cloud Computing can often be cheaper than maintaining your own data-center since public cloud vendors utilize economics of scale. However, practitioners sometimes calculate and find that the cloud increases their expense. While this can be the case for very specific scenarios, it contains a couple of oversights more often than not.</p>



<h4 class="wp-block-heading">Comparing Apples to Oranges</h4>



<p>When comparing the cost of the cloud to the cost of maintaining your data center you need to make sure to compare comparable things. Cloud computing costs take into account two important factors. One factor is the fact that most cloud services provide a <a href="https://en.wikipedia.org/wiki/Service-level_agreement" target="_blank" rel="noreferrer noopener" aria-label="Service Level Agreement (opens in a new tab)">Service Level Agreement</a> (SLA) for availability and/or durability. Maintaining similar 99.9%, 99.99% or even 99.999% availability SLAs on premise is not an easy task, and one which costs quite a lot of money. Most production applications require an SLA.</p>



<p>Another factor is the cost of maintenance. Managing and maintaining an on-premise data center requires a lot of IT personnel while cloud services cost fold that cost inside the service. It&#8217;s true that you still need IT professionals when utilizing the cloud, but their tasks are significantly different in such a scenario and you&#8217;ll usually need less when comparing both scenarios side-by-side.</p>



<h4 class="wp-block-heading">Auto-Scale Economy</h4>



<p>Another (positive) issue with cloud economics is the auto-scale economy. When you plan an on-premise data center, you usually need to plan the capacity to match the maximum required performance level. However, as most workloads are seasonal, it makes no sense to pay for full capacity all of the time. Examples of such seasonality are daytime vs. nighttime and weekday vs. weekend where there is simply no justification to pay for all the compute resources all the time.</p>



<p>This is where the cloud really shines &#8211; scale out your compute resources during peak times and scale down during the lows. And the best part &#8211; pay for only what you use, when you use it. From my experience, utilizing such a tactic can reduce you compute costs by as much as 60% depending on your specific workload.</p>



<h2 class="wp-block-heading">The History of the Cloud From My Perspective</h2>



<h3 class="wp-block-heading">2008 &#8211; The Cloud is Starting to Rise</h3>



<p>In 2008 I was a software architect at a government organization where public or private cloud options were almost never even heard of. Most of my production systems at the time ran on top of physical machines, and virtual machines were not considered a real option for production. I still remember the time when the IT person called me and said that &#8220;the servers crashed&#8221; meaning the servers physically crashed from the rack&#8230; <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f923.png" alt="🤣" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<p>The situation in the world was not much different. AWS was launched two years before, and Azure was announced at the end of the year. Cloud still seemed very far away, as can be seen in the following Gartner Hype Cycle for Emerging Technologies from 2008.</p>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="401" height="561" src="https://eranstiller.com/wp-content/uploads/2019/07/gartner-hype-cycle-for-emerging-technologies-2008.png" alt="Gartner Hype Cycle For Emerging Technologies 2008. Cloud is on the rise." class="wp-image-2016" srcset="https://eranstiller.com/wp-content/uploads/2019/07/gartner-hype-cycle-for-emerging-technologies-2008.png 401w, https://eranstiller.com/wp-content/uploads/2019/07/gartner-hype-cycle-for-emerging-technologies-2008-214x300.png 214w, https://eranstiller.com/wp-content/uploads/2019/07/gartner-hype-cycle-for-emerging-technologies-2008-286x400.png 286w, https://eranstiller.com/wp-content/uploads/2019/07/gartner-hype-cycle-for-emerging-technologies-2008-164x230.png 164w" sizes="auto, (max-width: 401px) 100vw, 401px" /><figcaption class="wp-element-caption">Gartner Hype Cycle For Emerging Technologies 2008 (<a href="http://insightextractor.com/2012/03/18/gartners-hype-cycle-for-cloud-computing-2008-2011/" target="_blank" rel="noreferrer noopener" aria-label="Source (opens in a new tab)">Source</a>)</figcaption></figure>
</div>


<h3 class="wp-block-heading">2010 &#8211; Peak Hype</h3>



<p>In 2010 I co-founded <a rel="noreferrer noopener" aria-label="CodeValue (opens in a new tab)" href="https://codevalue.net/" target="_blank">CodeValue</a>, which is an expert software services company. Cloud Computing was spoken about a lot, but real customers almost didn&#8217;t want to hear about it.</p>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="1024" height="694" src="https://eranstiller.com/wp-content/uploads/2019/07/gartner-hype-cycle-for-emerging-technologies-2010-1024x694.png" alt="Gartner Hype Cycle For Emerging Technologies 2010. Cloud Computing is at a hype peak." class="wp-image-2020" srcset="https://eranstiller.com/wp-content/uploads/2019/07/gartner-hype-cycle-for-emerging-technologies-2010-1024x694.png 1024w, https://eranstiller.com/wp-content/uploads/2019/07/gartner-hype-cycle-for-emerging-technologies-2010-300x203.png 300w, https://eranstiller.com/wp-content/uploads/2019/07/gartner-hype-cycle-for-emerging-technologies-2010-768x520.png 768w, https://eranstiller.com/wp-content/uploads/2019/07/gartner-hype-cycle-for-emerging-technologies-2010-591x400.png 591w, https://eranstiller.com/wp-content/uploads/2019/07/gartner-hype-cycle-for-emerging-technologies-2010-340x230.png 340w, https://eranstiller.com/wp-content/uploads/2019/07/gartner-hype-cycle-for-emerging-technologies-2010.png 1221w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Gartner Hype Cycle For Emerging Technologies 2010 (<a rel="noreferrer noopener" href="http://insightextractor.com/2012/03/18/gartners-hype-cycle-for-cloud-computing-2008-2011/" target="_blank">Source</a>)</figcaption></figure>
</div>


<p>At that phase only young startups agreed to consider the cloud, and the cloud (consultancy) business was quite small at the time.</p>



<h3 class="wp-block-heading">2012 &#8211; Will the Cloud Stick Around?</h3>



<p>In 2012, big customers still didn&#8217;t want to hear about the cloud. Maturity and security were still a big concern, while Virtual Machines and on-premise servers was well understood. Like every emerging technology, cloud computing hype was reduced and was spoken about less. Sure, it was still an innovative at IT/Dev conferences, but other than that we still didn&#8217;t know if it will catch on.</p>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="1024" height="661" src="https://eranstiller.com/wp-content/uploads/2019/07/gartner-hype-cycle-for-emerging-technologies-2012-1024x661.png" alt="Gartner Hype Cycle For Emerging Technologies 2012. Cloud computing is on the decline." class="wp-image-2028" srcset="https://eranstiller.com/wp-content/uploads/2019/07/gartner-hype-cycle-for-emerging-technologies-2012-1024x661.png 1024w, https://eranstiller.com/wp-content/uploads/2019/07/gartner-hype-cycle-for-emerging-technologies-2012-300x194.png 300w, https://eranstiller.com/wp-content/uploads/2019/07/gartner-hype-cycle-for-emerging-technologies-2012-768x495.png 768w, https://eranstiller.com/wp-content/uploads/2019/07/gartner-hype-cycle-for-emerging-technologies-2012-620x400.png 620w, https://eranstiller.com/wp-content/uploads/2019/07/gartner-hype-cycle-for-emerging-technologies-2012-357x230.png 357w, https://eranstiller.com/wp-content/uploads/2019/07/gartner-hype-cycle-for-emerging-technologies-2012.png 1375w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Gartner Hype Cycle For Emerging Technologies 2012 (<a rel="noreferrer noopener" aria-label="Source (opens in a new tab)" href="https://www.secureidnews.com/news-item/gartner-highlights-nfc-in-2012-hype-cycle-2/" target="_blank">Source</a>)</figcaption></figure>
</div>


<h3 class="wp-block-heading">2014 &#8211; A Cloud Turning Point</h3>



<p>For me personally, 2014 was a big turning point for the Cloud. For many customers, the Cloud has suddenly reached maturity. Starting with this point int time, more and more use-cases were found as suitable for the Cloud. Customers were more open to hear about the Cloud, and its spread increased from day to day.</p>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="960" height="580" src="https://eranstiller.com/wp-content/uploads/2019/07/gartner-hype-cycle-for-emerging-technologies-2014-e1562565760955.png" alt="Gartner Hype Cycle For Emerging Technologies 2014. Cloud computing is at a turning point." class="wp-image-2030" srcset="https://eranstiller.com/wp-content/uploads/2019/07/gartner-hype-cycle-for-emerging-technologies-2014-e1562565760955.png 960w, https://eranstiller.com/wp-content/uploads/2019/07/gartner-hype-cycle-for-emerging-technologies-2014-e1562565760955-300x181.png 300w, https://eranstiller.com/wp-content/uploads/2019/07/gartner-hype-cycle-for-emerging-technologies-2014-e1562565760955-768x464.png 768w, https://eranstiller.com/wp-content/uploads/2019/07/gartner-hype-cycle-for-emerging-technologies-2014-e1562565760955-662x400.png 662w, https://eranstiller.com/wp-content/uploads/2019/07/gartner-hype-cycle-for-emerging-technologies-2014-e1562565760955-381x230.png 381w" sizes="auto, (max-width: 960px) 100vw, 960px" /><figcaption class="wp-element-caption">Gartner Hype Cycle For Emerging Technologies 2014 (<a rel="noreferrer noopener" aria-label="Source (opens in a new tab)" href="https://www.forbes.com/sites/gartnergroup/2014/09/17/digital-business-technologies-dominate-gartner-2014-emerging-technologies-hype-cycle/#6d15bbbdfbb9" target="_blank">Source</a>)</figcaption></figure>
</div>


<h3 class="wp-block-heading">2019 &#8211; The Cloud is the Default</h3>



<p>Today, when approaching customers with new projects the Cloud is the default choice. No one even thinks about running a system on-premise unless they have a specific reason (such as regulation) to run on-premise, and its advantages are widely accepted. </p>



<p>This is a true revolution, and this is the main reason why I believe that every IT Pro and developer should master the Cloud.</p>



<h2 class="wp-block-heading">Why Is the Cloud Hard to Learn?</h2>


<div class="wp-block-image">
<figure class="aligncenter"><img loading="lazy" decoding="async" width="576" height="433" src="https://eranstiller.com/wp-content/uploads/2019/07/Cloud-developers-too-damn-high.jpg" alt="The amount of things cloud developers have to know, is too damn high!" class="wp-image-2032" srcset="https://eranstiller.com/wp-content/uploads/2019/07/Cloud-developers-too-damn-high.jpg 576w, https://eranstiller.com/wp-content/uploads/2019/07/Cloud-developers-too-damn-high-300x226.jpg 300w, https://eranstiller.com/wp-content/uploads/2019/07/Cloud-developers-too-damn-high-532x400.jpg 532w, https://eranstiller.com/wp-content/uploads/2019/07/Cloud-developers-too-damn-high-306x230.jpg 306w" sizes="auto, (max-width: 576px) 100vw, 576px" /></figure>
</div>


<p>All cloud platforms are advancing at a very high pace. The sheer amount of technologies and services that each professional needs to be aware of is huge. It already happened to me once that I was sure that something was not possible using a specific cloud service, only to be shown my mistake after it actually added support for that scenario in the previous week.</p>



<h2 class="wp-block-heading">My 2 Cents</h2>



<p>Staying on top of things in the Cloud era requires passion and dedication. My recommendation to those who want to get into the Cloud and promote their career is to start small and progress one step at a time. Don&#8217;t get overwhelmed by all the services various vendors are offering. Choose something that excites you and start from that. Build a real project with that service. From my experience, learning is done best by doing.</p>



<p>In addition, choose a learning accessory according to your personal learning style. Whether you like reading books or blog posts, watching online courses or asking at various online communities &#8211; find the one or two things which can promote you and act, so that you won&#8217;t get left behind.</p>



<h2 class="wp-block-heading">Slide Deck</h2>



<p>The slide deck from my talk can be found <a href="https://eranstiller.com/portfolio/today-the-cloud-is-your-advantage">here</a>. Enjoy!</p>
<p>The post <a rel="nofollow" href="https://eranstiller.com/boost-your-career-with-cloud-computing">Boost Your Career with Cloud Computing</a> appeared first on <a rel="nofollow" href="https://eranstiller.com">Eran Stiller</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://eranstiller.com/boost-your-career-with-cloud-computing/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
