<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Can Ürek]]></title><description><![CDATA[A personal blog about software engineering, AI-assisted development, architecture, developer productivity, and learning.]]></description><link>https://canurek.com</link><generator>RSS for Node</generator><lastBuildDate>Thu, 08 Oct 2026 19:42:13 GMT</lastBuildDate><atom:link href="https://canurek.com/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Full Stack Person: The Value of Connecting the Dots]]></title><description><![CDATA[Have you ever faced a problem that seemed simple at first, but became more complex the closer you looked?  
A bug that was not just a bug.A customer complaint that was not only about the customer.A pr]]></description><link>https://canurek.com/full-stack-person-the-value-of-connecting-the-dots</link><guid isPermaLink="true">https://canurek.com/full-stack-person-the-value-of-connecting-the-dots</guid><category><![CDATA[Software Engineering]]></category><category><![CDATA[AI]]></category><category><![CDATA[Systems Thinking]]></category><category><![CDATA[Career]]></category><dc:creator><![CDATA[Can Ürek]]></dc:creator><pubDate>Mon, 25 May 2026 08:50:33 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/611c0f99888ca15f5d39309f/7361498e-8d07-44d3-8f45-bd3fadac3248.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<hr />
<p>Have you ever faced a problem that seemed simple at first, but became more complex the closer you looked?  </p>
<p>A bug that was not just a bug.<br />A customer complaint that was not only about the customer.<br />A process issue that was not only about the process.<br />A security finding that was not just about updating a package.<br />A dependency between teams that was not merely about coordination.  </p>
<p>Real problems rarely arrive with clean labels.  </p>
<p>They often come as mixed signals. One part may be technical. Another may be about communication. Another may be about ownership, timing, architecture, domain knowledge, expectations, or decision-making.  </p>
<p>This is where the idea of a Full Stack Person becomes interesting to me.  </p>
<p>I do not see a Full Stack Person as someone who knows everything or does everything alone.  </p>
<p>I see a Full Stack Person as someone who connects the right dots, understands the real problem more clearly, and creates more meaningful impact.</p>
<hr />
<h2>What I Mean by “Full Stack Person”</h2>
<p>The term “full stack” is usually used in software development. A full-stack developer is someone who can work across different layers of an application, often both frontend and backend.</p>
<p>But when I say <strong>Full Stack Person</strong>, I mean something broader.</p>
<p>I mean someone who can connect technical skill, business context, domain knowledge, people, systems, risks, and decisions.</p>
<p>It is not about being everywhere. It is about seeing how things are connected.</p>
<p>A Full Stack Person does not need to be the deepest expert in every area. That would be unrealistic and unhealthy. But they need enough curiosity and awareness to ask better questions:</p>
<ul>
<li><p>What problem are we really solving?</p>
</li>
<li><p>Who is affected by this decision?</p>
</li>
<li><p>Which parts of the system are connected?</p>
</li>
<li><p>What context are we missing?</p>
</li>
<li><p>Who should be involved?</p>
</li>
<li><p>What would create the most useful impact?</p>
</li>
</ul>
<p>In other words, a Full Stack Person is not defined by knowing more things. They are defined by connecting things better.</p>
<hr />
<h2>Technical Skill Is Necessary, But Not Enough</h2>
<p>Technical depth still matters.</p>
<p>Without depth in at least one area, it is difficult to make reliable contributions. We need craft, expertise, and the ability to build, debug, analyze, and deliver with confidence.</p>
<p>But in many situations, code is only the visible part of the problem.</p>
<p>The hidden part may include domain knowledge, architectural decisions, process gaps, customer expectations, team dependencies, unclear ownership, or operational risk.</p>
<p>That is why the iceberg metaphor works well here.</p>
<img src="https://cdn.hashnode.com/uploads/covers/611c0f99888ca15f5d39309f/e17d9003-7997-422b-9daf-2b93e462f4cf.png" alt="" style="display:block;margin:0 auto" />

<p>The visible part is the code, the error, the ticket, the incident, or the request.<br />The hidden part is the context.</p>
<p>Solving only the visible part may feel productive. We close the ticket, fix the line, update the package, or change the endpoint.</p>
<p>But if the real cause remains under the surface, the same problem may reappear in another form.</p>
<p>The point is not to replace technical skill with something softer. The point is to combine technical skill with context.</p>
<p>Technical skills help us solve problems.<br />Context helps us understand whether we are solving the right problem.</p>
<hr />
<h2>Builder + Connector</h2>
<p>Some people are exceptional builders. They make things technically possible.</p>
<p>Others are exceptional connectors. They connect the product, the user, the story, the timing, and the market.</p>
<p>A classic example that often comes to mind is Steve Wozniak and Steve Jobs. Wozniak represents extraordinary technical depth: the ability to make something real, functional, and technically impressive. Jobs represent another kind of strength: product sense, storytelling, user experience, timing, and market connection.</p>
<p>The point is not to ask which one mattered more.</p>
<p>The real lesson is that great impact often appears where different strengths meet.</p>
<p>Technical depth creates possibility.<br />Connection turns that possibility into impact.</p>
<p>This is true far beyond Apple. In daily work, an idea can be technically correct but still fail to create value if it is not connected to the right problem, the right user, the right timing, or the right decision.</p>
<p>A strong solution is not only built well.<br />It is also connected well.</p>
<hr />
<h2>AI Gives Us Speed, Not Direction</h2>
<p>AI raises expectations by making many parts of our work faster.</p>
<p>We can access information, analyze alternatives, generate output, summarize, compare, draft, explore, and iterate much faster than before.</p>
<p>But speed alone does not create value.</p>
<img src="https://cdn.hashnode.com/uploads/covers/611c0f99888ca15f5d39309f/31292289-8ce8-4683-8dc4-0c916d950a6c.png" alt="" style="display:block;margin:0 auto" />

<p>If we move quickly in the wrong direction, we only produce the wrong result sooner.</p>
<p>This is why context becomes more important in the AI era, not less. When tools make output easier, the quality of the question matters more. The framing matters more. Our ability to evaluate the result matters more.</p>
<p>AI can help us produce output, but it does not automatically know what matters.</p>
<p>It can suggest options, but it does not own the consequences. It can generate content, but it does not fully understand the organization, the customer, the system history, the risk appetite, or the human context behind a decision.</p>
<p>That is why judgment becomes more important, not less.</p>
<p>A Full Stack Person in an AI-accelerated world is not someone who only uses AI to produce more output. It is someone who uses AI to think better, ask better questions, explore alternatives, and make better decisions.</p>
<p>AI gives us speed.<br />But it does not give us direction.</p>
<p>Direction still comes from understanding the problem, the context, the people involved, and the impact we want to create.</p>
<hr />
<h2>The Five Muscles of a Full Stack Person</h2>
<p>I think of the Full Stack Person mindset as five developable muscles.</p>
<p>They are not fixed personality traits. They can be practiced, strengthened, and improved over time. If we ignore them, they can also become weaker.</p>
<h3>1. Technical Depth</h3>
<p>Technical depth creates credibility.</p>
<p>A Full Stack Person does not need to be an expert in everything. But they should be strong enough in at least one area to contribute with confidence.</p>
<p>Depth helps us understand trade-offs, risks, constraints, and what it actually takes to implement a solution.</p>
<p>Breadth without depth can become shallow.<br />Depth without connection can become isolated.</p>
<p>The goal is to build depth and connect it to a wider context.</p>
<h3>2. Systems Thinking</h3>
<p>Systems thinking means looking beyond the immediate box.</p>
<p>A performance issue may not be only about one endpoint.<br />A security issue may not be only about one dependency.<br />A customer complaint may not be only about one feature.</p>
<p>Systems have dependencies. Decisions have side effects. Local optimizations can create wider problems.</p>
<p>Systems thinking helps us ask better questions:</p>
<ul>
<li><p>What else is connected to this?</p>
</li>
<li><p>What might break if we change this?</p>
</li>
<li><p>Who else is affected?</p>
</li>
<li><p>What pattern is behind this issue?</p>
</li>
</ul>
<p>It helps us move from symptoms to causes.</p>
<h3>3. Communication</h3>
<p>Understanding is not enough if it cannot be explained.</p>
<p>Communication turns insight into shared understanding.</p>
<p>A good explanation can align a team. A poor explanation can hide a good idea. In complex environments, communication is not a soft extra. It is part of the work.</p>
<p>It helps people understand why something matters, what trade-offs exist, what risk is being accepted, and what decision is needed.</p>
<p>A Full Stack Person does not only collect context.<br />They help make context visible to others.</p>
<h3>4. Learning Agility</h3>
<p>Tools, expectations, and systems change quickly.</p>
<p>AI is one example, but the pattern is bigger than AI. Frameworks change. Architectures evolve. Product needs and priorities change. Organizations reorganize. New constraints appear.</p>
<p>Learning agility is the ability to adapt without losing direction.</p>
<p>It does not mean chasing every trend. It means learning what is useful, understanding what changes the work, and turning new knowledge into better decisions.</p>
<h3>5. Judgment</h3>
<p>Judgment is the ability to choose what matters.</p>
<p>What should we focus on?<br />What should we ignore?<br />Which output can we trust?<br />Which risk is acceptable?<br />Which problem is worth solving now?<br />When is “good enough” actually good enough?</p>
<p>As AI increases speed and output, judgment becomes even more important.</p>
<p>The future will not only require people who can produce more. It will require people who can make better decisions.</p>
<hr />
<h2>Teaching Makes Learning Visible</h2>
<p>One of the best ways to test understanding is to explain an idea to someone else.</p>
<p>When we explain something, we discover what is clear, what is shallow, and what is missing.</p>
<p>Many times, an idea feels clear in our head. But when we try to explain it, we notice the gaps. We see the weak links. We realize which parts we cannot connect yet.</p>
<p>Teaching is not only a way to transfer knowledge.<br />It is also a way to make our own learning visible.</p>
<p>This is also why writing is useful. Writing forces structure. It turns vague thoughts into visible arguments and shows whether an idea actually holds together.</p>
<p>In that sense, this article is also part of my own learning process.</p>
<hr />
<h2>What a Full Stack Person Is Not</h2>
<p>The idea can easily be misunderstood, so it is important to define its boundaries.</p>
<p>A Full Stack Person is not a hero. They are not someone who replaces the team or tries to do everything alone.</p>
<p>In fact, the opposite is true.</p>
<p>The goal is not to replace specialists. The goal is to work with them more effectively.</p>
<p>A Full Stack Person does not say, “I can do everything.”</p>
<p>They ask, “How can we create more meaningful impact together?”</p>
<p>They help connect the right people, the right information, the right problem, and the right decisions.</p>
<p>This mindset should increase the team’s impact, not place more burden on one person.</p>
<p>If the concept turns into “one person should do everything,” then it has been misunderstood.</p>
<hr />
<h2>Connect Better, Create Better Impact</h2>
<p>For me, the whole idea comes down to this: better connections create more meaningful impact.</p>
<img src="https://cdn.hashnode.com/uploads/covers/611c0f99888ca15f5d39309f/e7fee890-50bb-4d6a-85b3-647fb9e5f288.png" alt="" style="display:block;margin:0 auto" />

<p>Technical depth makes us strong.<br />Context makes us useful.<br />Connection makes us impactful.</p>
<p>Knowing more still matters. But in complex environments, knowledge creates more value when it is connected to the right context, people, problems, and decisions.</p>
<p>A Full Stack Person is not someone who knows everything.</p>
<p>They are someone who understands the problem more clearly, connects the right dots, and helps create more meaningful impact.</p>
<p>The future will not be shaped only by people who know more.</p>
<p>It will be shaped by people who connect knowledge, people, problems, and decisions more effectively.</p>
]]></content:encoded></item><item><title><![CDATA[The Evolution of Resources: From Books to AI]]></title><description><![CDATA[When I first encountered computers, it was the early 1990s. My first PC was a Commodore 64 connected to a TV using an antenna input. Games were loaded from cassette tapes, and the excitement of watching a game load, which could sometimes take minutes...]]></description><link>https://canurek.com/the-evolution-of-resources-from-books-to-ai</link><guid isPermaLink="true">https://canurek.com/the-evolution-of-resources-from-books-to-ai</guid><category><![CDATA[AI]]></category><dc:creator><![CDATA[Can Ürek]]></dc:creator><pubDate>Mon, 25 Nov 2024 21:03:08 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1732559766459/f5d0941b-321e-4e27-a1f1-2b92f5453012.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>When I first encountered computers, it was the early <strong>1990s</strong>. My first PC was a <strong>Commodore 64</strong> connected to a TV using an antenna input. Games were loaded from cassette tapes, and the excitement of watching a game load, which could sometimes take minutes, was unforgettable. It was a perfect era filled with timeless classic games.</p>
<p>At that time, my only source for learning programming was the C64 Basic manual. I wrote simple programs with it, modified them, and recorded my work on cassette tapes. Additionally, I worked with <strong>Simon’s Basic</strong> and explored <strong>machine language</strong> through a cartridge plugged into the C64.</p>
<p>Later, I discovered the Amiga, a dream machine for its time. The ability to load games via floppy disks, the absence of cassette alignment issues (a common problem with tapes), and the enhanced graphics were mesmerizing. I never owned one, which only heightened my curiosity.</p>
<p>As time progressed, I also worked with more advanced hardware: the 8086, 386DX, 486, and Pentium. These machines allowed me to dive into programming languages like Pascal, Borland C++, and Visual Basic. Later, I explored web development with ASP 1.1 and eventually transitioned to learning C#, which became my primary programming language. Books continued to be my primary source of knowledge, serving as my gateway to understanding the intricacies of code.</p>
<hr />
<p><strong>The Internet Revolution</strong></p>
<p>The arrival of the internet was a game-changer. Information was no longer confined to books. Search engines like Google became our companions, making knowledge accessible to everyone. From forums to online guides, the internet enabled an unprecedented exchange of ideas and solutions.</p>
<p>However, this abundance of resources sometimes led to surface-level understanding. For me, questioning and understanding were always the priority. Every piece of information I encountered was scrutinized, adapted, and applied. Passive consumption was never an option for me.</p>
<hr />
<p><strong>Artificial Intelligence: A Tool, Not a Threat</strong></p>
<p>While artificial intelligence might seem like a recent innovation, its development has been ongoing for decades. From early expert systems to neural networks, AI continues to evolve as a tool to assist us, just as books and the internet once did.</p>
<p>Today, AI transforms how we find and use information. Tools like ChatGPT and Bard are improving fields such as healthcare and creative arts, helping people rather than replacing them.</p>
<p>Despite its growing presence, AI remains a tool designed to assist, not to take over. Like books and the internet, it provides inspiration and solutions, but the final responsibility for decisions and creativity remains ours.</p>
<hr />
<p><strong>Changing Tools, Constant Values</strong></p>
<p>New tools and resources will constantly emerge. What truly matters is not the tool itself, but how we use it. Whether it was books in the 1990s, the internet in the 2000s, or artificial intelligence today, the principle remains the same: question, adapt, and create.</p>
<p>The fear that AI will replace human jobs is misguided. Instead, AI is transforming the way we work. It doesn’t eliminate roles but redefines them, requiring us to learn and grow alongside these advancements.</p>
<hr />
<p><strong>Conclusion: Tools + Producers = Products</strong></p>
<p>I’ve always lived by a simple equation: Tools + Producers = Products. Tools evolve, but they don’t alter this equation. Whether I was using books, the internet, or advanced AI tools, I never relied on them without question. They inspired me and helped me think differently, but the ownership of the work—its craftsmanship—was always mine.</p>
<p>The same principle should apply to you too. Question what you learn, take ownership of your work, and let your creativity guide you.</p>
<p><strong>“What you do with what you know makes all the difference.”</strong></p>
<p><em>This article is dedicated to my uncle,</em> <strong><em>Mustafa Özçınar</em></strong>, <em>whose influence was instrumental in my journey into the world of technology. From the first Commodore 64 games to the mesmerizing Amiga computers, he played a key role in shaping my path into this profession. I will always be grateful for his guidance and inspiration.</em></p>
]]></content:encoded></item><item><title><![CDATA[Coding challenges]]></title><description><![CDATA[Let's talk about coding challenges in this article.
There are many websites where we can test our coding skills, and many different questions are waiting for us to solve them.
Some companies, even the biggest ones, use these sites to evaluate candida...]]></description><link>https://canurek.com/coding-challenges</link><guid isPermaLink="true">https://canurek.com/coding-challenges</guid><category><![CDATA[coding]]></category><category><![CDATA[challenge]]></category><category><![CDATA[algorithms]]></category><category><![CDATA[data structures]]></category><dc:creator><![CDATA[Can Ürek]]></dc:creator><pubDate>Mon, 12 Sep 2022 13:13:26 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/unsplash/4Ennrbj1svk/upload/v1662984188003/xDZt4Tx1h.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Let's talk about coding challenges in this article.</p>
<p>There are many websites where we can test our coding skills, and many different questions are waiting for us to solve them.</p>
<p>Some companies, even the biggest ones, use these sites to evaluate candidates. And to be successful in these assessments, you need to know some fundamental things about coding.</p>
<p>I am not saying that I am very successful in all these matters. I'll just try to share some information and resources, and at the end of the article, I will share my solution to a question.</p>
<p><strong>Data structures and Algorithms</strong> will be our starting points. These are not dependent on any programming language, and all languages have the same structure or an equivalent one.</p>
<p>Some people, especially juniors, think that these are not necessary. But there are some use cases for all of them.</p>
<p>Most developers nowadays work with frameworks and CRUD scenarios. But some of them know that this is not enough and that this is not seniority. Working like that is just like filling empty spaces, and everyone can do that. And you need to know the fundamentals if you want to do more.</p>
<p>Anyway, let's start with the <strong>Data Structures.</strong></p>
<p>You can see commonly used data structures at the following link and get more info by clicking on their names. There are some good explanations.</p>
<p><a target="_blank" href="https://www.bigocheatsheet.com/">https://www.bigocheatsheet.com/</a></p>
<p>My primary programming language is C#. That's why I also wanted to share this beautiful article too.</p>
<p><a target="_blank" href="https://dev.to/adavidoaiei/fundamental-data-structures-and-algorithms-in-c-4ocf">https://dev.to/adavidoaiei/fundamental-data-structures-and-algorithms-in-c-4ocf</a></p>
<p>And the below resource is a very good compilation.</p>
<p><a target="_blank" href="https://github.com/mtdvio/every-programmer-should-know">https://github.com/mtdvio/every-programmer-should-know</a></p>
<p>I'm assuming we have some ideas on how and where we can store the data we want to work on, and now we can discuss how we can manipulate it to get the desired result.</p>
<p>So our new topic is <strong>Algorithms</strong>.</p>
<p>There is no limit when talking about algorithms. We'll talk about commonly used algorithms, but as you can see from the description below, there is no limit.</p>
<p>"In mathematics and computer science, an algorithm is a finite sequence of rigorous instructions, typically used to solve a class of specific problems or perform a computation. Algorithms are used as specifications for performing calculations and data processing."</p>
<p>Sorting is one of the top topics in algorithms. And we should choose the right algorithm according to our needs. The following resource can give you some ideas.</p>
<p><a target="_blank" href="https://www.toptal.com/developers/sorting-algorithms">https://www.toptal.com/developers/sorting-algorithms</a></p>
<p><strong>Keep in mind that it takes a lot of practice to better understand algorithms and data structures and to choose and use the right ones</strong></p>
<p>At the following link, you can get more info about algorithms.</p>
<p><a target="_blank" href="https://www.calltutors.com/blog/types-of-algorithms/">https://www.calltutors.com/blog/types-of-algorithms/</a></p>
<p>I guess there are some links in all of the coding challenges sites to work on the different types of algorithms. For example, on the hacker rank website, you can access it from the following link.</p>
<p><a target="_blank" href="https://www.hackerrank.com/domains/algorithms">https://www.hackerrank.com/domains/algorithms</a></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1662985514889/xUjXigWbC9.png" alt="Screen Shot 2022-09-12 at 15.14.36.png" /></p>
<p>As you can imagine, there is much more detail on all of these things. But the information that I tried to share may be a good start for some people.</p>
<p>And finally, I will share my own solution to a problem. Of course, I'm not sure it was a perfect solution. And I think the hardest part of solving these questions is understanding them. But maybe someone can show me a better approach, and I can review my solution.</p>
<p>The link to the problem is below.</p>
<p><a target="_blank" href="https://www.hackerrank.com/challenges/countingsort4/problem">https://www.hackerrank.com/challenges/countingsort4/problem</a></p>
<p>And the codes for my solution are below.</p>
<pre><code class="lang-plaintext">var middleOfArr = arr.Count / 2;

var filterArr = arr.Take(middleOfArr).ToHashSet(); //Magic line

var sortedArr = arr.OrderBy(x =&gt; int.Parse(x[0])).ToList();

var sb = new StringBuilder();

foreach(var item in sortedArr)
{
   var str = item[1];

    var hasFilter = filterArr.Contains(item);

    if(!hasFilter)
    {
        sb.Append(str + " ");
        continue;
    }

    sb.Append("- ");
}

Console.Write(sb.ToString(), Console.Out);
</code></pre>
<p>I hope this article will be useful for some people.</p>
<p>See you next time.</p>
]]></content:encoded></item></channel></rss>