How I Learned to Read Code

 



Since the day I started learning software, the first thing I have seen, read and heard from all sources, social media accounts, online trainings and scholars of this business has been “code, practice, try to write”.

The second thing is “read other people’s code”. But why and how? How can reading code benefit me? Where to start? Do you read code like a book? So many questions in my head. And the interesting thing is that this is a recommendation that is said to be valid when learning every language, every framework of software. No matter what you are learning, this advice never changes. So I’ve gotten quite advanced in reading code by focusing on this topic, researching, starting from simple code snippets, reading and reading — sometimes I even continued without understanding it.

Then I realized that reading code is a very valuable skill in the software world and understanding the code written by others helps me to become a better developer in my own projects and to work more effectively in a team. Learning to read code seems difficult at the beginning, it was for me too, but I have prepared for you what I did and what I learned in this process by quoting from different sources and I think you can improve it by taking it step by step. Here is a detailed roadmap for you:

What is Code Reading and Why is it Important?

Code reading means analyzing and understanding code written by someone else. Through this skill:

  • You learn new techniques and methods.
  • Improve your ability to debug and optimize existing code.
  • You gain different perspectives to become a better software developer.

Learning to read code is like learning a language: It involves understanding words, sentences and paragraph structures.

How to Start Code Reading?

Start with Small and Simple Code:
It’s best to start with simple and well-documented code samples.

Check GitHub or the official sample projects of the technology you’re using. For example, if you’re learning Flutter, Flutter’s “counter” sample app is a good place to start.

Understand the purpose of the code:
Before you start reading, find out what the code does. Read the project’s README file or description.

Is the code running on a page, or is it connecting to an API? Knowing this makes your job easier.

Progress piece by piece:
Instead of trying to understand the entire code at once, focus on small sections. For example, in a Flutter project, start by looking only at the “main.dart” file.

Focus on Variables and Functions:
Variable names and functions usually describe the purpose of the code. For example, if a variable is named totalCost, you can guess that it is related to total cost.

Read the Comments:
Comment lines (starting with //) and documentation help you understand the logic of the code. Pay attention to these comments.

Watch the Code Run:
Run the code in a development environment to see how it works. Observe which pieces of code produce which results.

Steps You Can Follow During Code Reading

Make an Overview:
Take a quick look at the files. Get an idea by looking at the names and structure of the files.

Focus on Functions and Methods:
Pay attention to the parts of the code that perform the most basic functions. If an application allows a user to log in, look for functions named “login” or “authenticate”.

Follow the Flow:
Follow the flow of the code by going through the starting point of the program (usually the main function).

Search for Difficult Parts:
When you see an unfamiliar structure, library or method, look it up. Stack Overflow, GitHub or documentation are the best resources for this.

Ask Questions and Take Notes:
Asking questions like “Why is this done?”, “What does this variable do?” while reading code increases your understanding.

Recommendations for Practicing Code Reading

Review Small Open Source Projects:
Find and review small projects on platforms like GitHub. Simple todo lists, counter apps, or basic web projects are ideal.

Read Your Own Projects:
Look back at the code you’ve written before. Asking yourself “Why did I do it this way?” will also help you learn.

Participate in Code Reviews:
If you work in a team, get involved in code review processes. In these processes, you will witness different writing styles and approaches.

Tools to Improve Code Reading

Linter Usage:
Tools that improve code readability (e.g. dart analyze for Flutter) show code errors and warnings.

Debugging Tools:
Use debugging tools to understand what is happening while the code is running. This helps you see which variables changed and when.

Version Control (Git):
Use Git to look at the history of the code. It is useful to examine the differences between previous versions of the code and the current version.

Up to this point, I’ve listed general things such as what code reading is, how it can be read, which steps can be followed. But I felt the need to learn how to read code after I started working with Flutter. Therefore, in the rest of this article, I want to talk about how to read code specifically for Flutter and where to start.

Code Reading in Flutter

Reading code in Flutter seems to be more difficult at the beginning than in other languages, it seemed that way to me. There are a few reasons for this.

The first one is Flutter’s Widget Structure. Everything in Flutter is a widget and widgets are nested. At first, this structure may make you think “Where does the code start and where does it end?”.

The second is Flutter’s dynamism. Especially features like animation and state management can make it difficult to understand the flow of the code.

The third is Flutter’s packages. Many Flutter projects use dependencies from the pubspec.yam file. A function or widget you see in the code may come from another package.

Being aware of these difficulties makes you patient with yourself while reading. I say this because I have experienced it myself. Now let’s see how to read code in Flutter step by step.

Recognize the Structure of Flutter Projects

Understanding the overall file structure of a Flutter project makes the code reading process easier. A typical project looks like this:

lib/
|- main.dart
|- screens/
|- home_screen.dart
|- settings_screen.dart
|- widgets/
|- custom_button.dart
|- models/
|- user_model.dart

Understanding main.dart File

main.dart is the entry point of every Flutter application. Review this file before reading code:

void main() {
runApp(const MyApp());
}

class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const HomeScreen(),
);
}
}

Ask the following questions when reviewing this code:

What does runApp do? (Answer: Launches the application.)

What type of widget is MyApp? (Answer: StatelessWidget.)

What is inside MaterialApp? (Answer: Theme, header and home screen information.)

Understand Widget Hierarchy in Flutte

Understanding the widget hierarchy is key to reading Flutter code. For example, let’s look at Flutter’s standard counter implementation:

class CounterScreen extends StatefulWidget {
const CounterScreen({Key? key}) : super(key: key);
@override
_CounterScreenState createState() => _CounterScreenState();
}


class _CounterScreenState extends State<CounterScreen> {
int _counter = 0;
void _incrementCounter() {
setState(() {
_counter++;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Counter App'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Text('You have pushed the button this many times:'),
Text(
'$_counter',
style: Theme.of(context).textTheme.headline4,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: const Icon(Icons.add),
),
);
}
}

When reading this code, pay attention to the following:

Scaffold provides the main skeleton of the app (appBar, body, floatingActionButton).

Why is setState used? (Answer: To update the UI when the state changes.)

How are the widgets in Column arranged? (Answer: In a vertical layout, centered using mainAxisAlignment.)

Watch Code Flow

Follow the flow to understand how widgets work:

Starting Point: Find the home widget in the main.dart file.

Go from one widget to another: For example, if a button in HomeScreen redirects to another screen, see what function that button calls.

Example: Understanding Navigation Flow

class HomeScreen extends StatelessWidget {
const HomeScreen({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Home'),
),
body: Center(
child: ElevatedButton(
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => const SettingsScreen()),
);
},
child: const Text('Go to Settings'),
),
),
);
}
}

What does Navigator.push do? (Answer: It takes the user to another screen called SettingsScreen.)

Find and analyze the SettingsScreen in the code.

Explore Packages and Libraries

Flutter projects often use packages and libraries. For example, if a project uses the http package, you might see the following in the code:

import 'package:http/http.dart' as http;
Future<void> fetchData() async {
final response = await http.get(Uri.parse('https://api.example.com/data'));
if (response.statusCode == 200) {
print(response.body);
} else {
throw Exception('Failed to load data');
}
}

What is http.get and what does it do? Check the HTTP package documentation for more information about this package.

Follow the code step by step and try to understand how the data is processed.

Tips for Practicing Code Reading

Run and Experience Flutter Projects:
Run in an IDE (e.g. VS Code) to see how the code works. Change widget properties and observe how it is affected.

Start with Simple Code and Widgets:
Learn how to use basic widgets like Container, Row, Column, Text, Button. For example, modify the code to understand how widgets in a Row are placed side by side.

Focus on State Management Codes:
Constructs such as setState, Provider, or Riverpod will help you understand how the code works in depth.

More Suggestions

Use Flutter Sample Code: There are plenty of examples in Flutter’s official documentation and on GitHub. For example, you can check out the Material3 Demo repo.

Make Progress by Asking Questions: Questions like “What does this widget do?”, “Which library is used for what?” will deepen your understanding.

Read Your Own Projects: Look at the Flutter projects you’ve written before and think, “How could I have done it better?”

Last but not least Be Patient!

Reading code is a skill that develops over time. It’s normal to struggle at first, but with regular practice you’ll get faster and easier to understand. Once you gain confidence with simple code to start with, you can move on to more complex projects.

Thank you so much for reading.

Selin.

Kod Okumayı Nasıl Öğrendim?

 



Yazılım öğrenmeye başladığım günden beri tüm kaynaklarda, sosyal medya hesaplarında, online eğitimlerde ve bu işin alaylılarında gördüğüm, okuduğum ve duyduğum ilk şey “kodla, pratik yap, yazmaya çalış” oldu.

İkinci şey ise “başkalarının kodlarını oku”. Tamam da neden ve nasıl? Kod okumanın bana ne gibi bir faydası olabilir? Nereden başlanır? Kodlar kitap gibi mi okunur? Kafamda bir sürü soru. Ve işin ilginç tarafı bu yazılımın her dilinde, her framework’ünü öğrenirken de geçerli olduğu söylenen bir tavsiye. Ne öğreniyorsanız öğrenin bu tavsiyeler hiç değişmiyor. Ben de bu konunun üzerine eğilerek, araştırarak, basit kod parçacıklarından başlayarak okuya okuya -hatta bazen anlamayarak devam ettiğim de oldu- kod okuma işinde epey ilerledim.

Sonrasında gördüm ki kod okumak, yazılım dünyasında çok değerli bir beceri ve başkalarının yazdığı kodları anlamak, hem kendi projelerimde daha iyi bir yazılımcı olmama hem de ekip içinde daha etkili çalışmama yardımcı oluyor. Kod okumayı öğrenmek başlangıçta zor gibi görünüyor, bana da öyle gelmişti ama bu süreçte yaptığım şeyleri, öğrendiklerimi bira da farklı kaynaklardan alıntılayarak senin için hazırladım ve adım adım ilerleyerek bunu senin de geliştirebileceğini düşünüyorum. İşte sana detaylı bir yol haritası:

Kod Okuma Nedir ve Neden Önemlidir?

Kod okuma, başka birinin yazdığı kodu inceleyip anlamak demektir. Bu beceri sayesinde:

  • Yeni teknikler ve yöntemler öğrenirsin.
  • Hata ayıklama ve mevcut kodu optimize etme yeteneğin gelişir.
  • Daha iyi bir yazılım geliştirici olmak için farklı bakış açıları edinirsin.

Kod okumayı öğrenmek, bir dil öğrenmeye benzer: Kelimeleri, cümleleri ve paragraf yapılarını anlamayı içerir.

Kod Okumaya Nasıl Başlanır?

Küçük ve Basit Kodlardan Başla:

Basit ve iyi belgelenmiş kod örnekleriyle başlamak en iyisidir.

GitHub’da veya kendi kullandığın teknolojinin resmi örnek projelerini incele. Örneğin, Flutter öğreniyorsan, Flutter’ın “counter” (sayaç) örnek uygulaması güzel bir başlangıç olabilir.

Kodun Amacını Anla:

Okumaya başlamadan önce kodun ne yaptığını öğren. Projenin README dosyasını veya açıklamalarını oku.

Kod bir sayfada mı çalışıyor, yoksa bir API’ye mi bağlanıyor? Bunu bilmek işini kolaylaştırır.

Parça Parça İlerleme:

Kodun tamamını bir anda anlamaya çalışmak yerine, küçük bölümlere odaklan. Örneğin, bir Flutter projesinde sadece “main.dart” dosyasına bakarak başla.

Değişkenler ve Fonksiyonlara Odaklan:

Değişken isimleri ve fonksiyonlar genelde kodun amacını açıklar. Örneğin, bir değişken totalCost adını taşıyorsa, bunun toplam maliyetle ilgili olduğunu tahmin edebilirsin.

Açıklamaları Oku:

Yorum satırları (// ile başlayan) ve dökümantasyon kodun mantığını anlamanda yardımcı olur. Bu açıklamalara dikkat et.

Kodun Çalışmasını İzle:

Kodun nasıl çalıştığını görmek için bir geliştirme ortamında çalıştır. Hangi kod parçalarının nasıl sonuçlar ürettiğini gözlemle.

Kod Okuma Sırasında Takip Edebileceğin Adımlar

Genel Bakış Yap:

Dosyalara hızlıca göz gezdir. Dosyaların isimlerine ve yapısına bakarak bir fikir edin.

Fonksiyonlar ve Metotlara Odaklan:

Kodun en temel işlevlerini gerçekleştiren kısımlara dikkat et. Bir uygulama kullanıcının giriş yapmasını sağlıyorsa, “login” ya da “authenticate” isimli fonksiyonlara bak.

Akışı İzle:

Programın başlangıç noktası (genellikle main fonksiyonu) üzerinden ilerleyerek kodun akışını takip et.

Zor Gelen Kısımlarda Araştır:

Bilmediğin bir yapı, kütüphane ya da metot gördüğünde hemen araştır. Stack Overflow, GitHub veya dokümantasyon bu konuda en iyi kaynaklardır.

Sorular Sor ve Not Al:

Kod okurken “Bu neden yapılmış?”, “Bu değişken ne iş yapıyor?” gibi sorular sormak anlamanı artırır.

Kod Okuma Pratiği İçin Öneriler

Küçük Açık Kaynak Projeleri İncele:

GitHub gibi platformlardan küçük projeler bulup incele. Basit todo listeleri, sayaç uygulamaları, ya da temel web projeleri idealdir.

Kendi Projelerini Oku:

Daha önce yazdığın kodlara tekrar bak. Kendine “Bunu neden böyle yapmışım?” diye sormak da öğrenmene yardımcı olur.

Kod İncelemelerine Katıl:

Eğer bir ekipte çalışıyorsan, kod inceleme süreçlerine dahil ol. Bu süreçlerde farklı yazım stillerine ve yaklaşımlara tanık olursun.

Kod Okumayı İyileştirmek İçin Araçlar

Linter Kullanımı:

Kodun okunabilirliğini artıran araçlar (ör. Flutter için dart analyze) kod hatalarını ve uyarılarını gösterir.

Debugging Araçları:

Kod çalışırken ne olduğunu anlamak için hata ayıklama araçlarını kullan. Bu, hangi değişkenlerin ne zaman değiştiğini görmene yardımcı olur.

Versiyon Kontrolü (Git):

Kodun geçmişine bakmak için Git kullan. Kodun önceki halleri ile şu anki hali arasındaki farkları incelemek faydalıdır.

Buraya kadar kod okumanın ne olduğu, nasıl okunabileceği, hangi adımların izlenebileceği gibi genel geçer maddeleri sıraladım. Ama ben asıl Flutter çalışmaya başladıktan sonra kod okumayı öğrenme ihtiyacı hissettim. Bu yüzden yazımın devamında Flutter özelinde kod okuma nasıl yapılır, nereden başlanır, bunlardan söz etmek istiyorum.

Flutter’da Kod Okumak

Flutter’da kod okumak başlangıçta diğer dillerde olduğundan daha zor görünüyor, bana öyle gelmişti. Bunun bir kaç sebebi var. Birincisi Flutter’ın Widget Yapısı. Flutter’da her şey bir widget’tır ve widget’lar iç içe yerleşir. İlk başta bu yapı, “Kod nerede başlıyor, nerede bitiyor?” diye düşündürebilir.

İkincisi Flutter’ın dinamikliği. Özellikle animasyon ve State management gibi özellikler kodun akışını anlamayı zorlaştırabilir.

Üçüncüsü de Flutter’ın paketleri. Birçok Flutter projesi, pubspec.yamldosyasındaki bağımlılıkları kullanır. Kodda gördüğün bir fonksiyon ya da widget başka bir paketten geliyor olabilir.

Bu zorlukların farkında olmak, okuma sırasında kendine karşı sabırlı olmanı sağlıyor. Bunu kendimde tecrübe ettiğim için söylüyorum. Şimdi adım adım Flutter’da kod okuma nasıl yapılır bunu inceleyelim.

Flutter Projelerinin Yapısını Tanı

Bir Flutter projesinin genel dosya yapısını anlamak kod okuma sürecini kolaylaştırır. Tipik bir proje şu şekildedir:

lib/
|- main.dart
|- screens/
|- home_screen.dart
|- settings_screen.dart
|- widgets/
|- custom_button.dart
|- models/
|- user_model.dart

İlk Adım: main.dart Dosyasını Anlamak

main.dart, her Flutter uygulamasının giriş noktasıdır. Kod okurken önce bu dosyayı incele:

void main() {
runApp(const MyApp());
}

class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);

@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const HomeScreen(),
);
}
}

Bu kodu incelerken şu soruları sor:

runApp ne yapar? (Cevap: Uygulamayı başlatır.)

MyApp hangi widget türü? (Cevap: StatelessWidget.)

MaterialApp içinde ne var? (Cevap: Tema, başlık ve ana ekran bilgisi.)

Flutter’da Widget Hiyerarşisini Anla

Widget hiyerarşisini anlamak, Flutter kodlarını okumanın anahtarıdır. Örneğin, Flutter’ın standart sayaç uygulamasına bakalım:

class CounterScreen extends StatefulWidget {
const CounterScreen({Key? key}) : super(key: key);

@override
_CounterScreenState createState() => _CounterScreenState();
}

class _CounterScreenState extends State<CounterScreen> {
int _counter = 0;

void _incrementCounter() {
setState(() {
_counter++;
});
}

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Counter App'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Text('You have pushed the button this many times:'),
Text(
'$_counter',
style: Theme.of(context).textTheme.headline4,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: const Icon(Icons.add),
),
);
}
}

Bu kodu okurken şunlara dikkat et:

Scaffold uygulamanın ana iskeletini sağlar (appBar, body, floatingActionButton).

setState neden kullanılıyor? (Cevap: Durum değiştiğinde kullanıcı arayüzünü güncellemek için.)

Column içindeki widget’lar nasıl düzenlenmiş? (Cevap: Dikey bir düzen içinde, mainAxisAlignment kullanılarak merkezlenmiş.)

Kod Akışını İzle

Widget’ların nasıl çalıştığını anlamak için akışı takip et:

Başlangıç Noktası: main.dart dosyasındaki home widget’ını bul.

Bir Widget’tan Diğerine Git: Örneğin, HomeScreen içinde bir buton başka bir ekrana yönlendiriyorsa, bu butonun hangi fonksiyonu çağırdığına bak.

Örnek: Navigasyon Akışını Anlamak

class HomeScreen extends StatelessWidget {
const HomeScreen({Key? key}) : super(key: key);

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Home'),
),
body: Center(
child: ElevatedButton(
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => const SettingsScreen()),
);
},
child: const Text('Go to Settings'),
),
),
);
}
}

Navigator.push ne yapar? (Cevap: Kullanıcıyı SettingsScreen adlı başka bir ekrana götürür.)

Kodda geçen SettingsScreen’i bulup incele.

Paketleri ve Kütüphaneleri Araştır

Flutter projelerinde sık sık paketler ve kütüphaneler kullanılır. Örneğin, bir proje http paketini kullanıyorsa, kodda şunu görebilirsin:

import 'package:http/http.dart' as http;

Future<void> fetchData() async {
final response = await http.get(Uri.parse('https://api.example.com/data'));
if (response.statusCode == 200) {
print(response.body);
} else {
throw Exception('Failed to load data');
}
}

http.get nedir ve ne yapar? Bu paket hakkında daha fazla bilgi için HTTP paketi dokümantasyonuna göz at.

Kodun çalıştığı yeri adım adım takip et ve verinin nasıl işlendiğini anlamaya çalış.

Kod Okuma Pratiği İçin İpuçları

Flutter Projelerini Çalıştır ve Deneyimle:

Kodun nasıl çalıştığını görmek için bir IDE (ör. VS Code) içinde çalıştır. Widget özelliklerini değiştir ve nasıl etkilendiğini gözlemle.

Basit Kodlar ve Widget’larla Başla:

ContainerRowColumnTextButton gibi temel widget’ların nasıl kullanıldığını öğren. Örneğin, bir Row içindeki widget’ların yan yana nasıl yerleştiğini anlamak için kodu değiştir.

State Management Kodlarına Odaklan:

setStateProvider, veya Riverpod gibi yapılar kodun işleyişini derinlemesine anlamana yardımcı olur.

Öneriler

Flutter Örnek Kodlarını Kullan: Flutter’ın resmi dokümantasyonunda ve GitHub’da bolca örnek var. Örneğin, Material3 Demo reposunu inceleyebilirsin.

Sorular Sorarak İlerleme Sağla: “Bu widget ne işe yarıyor?”, “Hangi kütüphane ne için kullanılmış?” gibi sorular seni derinleştirir.

Kendi Projelerini Oku: Daha önce yazdığın Flutter projelerini inceleyip “Daha iyi nasıl yapardım?” diye düşün.

Son Olarak: Sabırlı Ol!

Kod okumak, zamanla gelişen bir beceridir. İlk başta zorlanmak normaldir, ama düzenli pratikle hem hızlanır hem de anlamayı kolaylaştırırsın. Başlangıç için basit kodlarla kendine güven kazandıktan sonra, daha karmaşık projelere geçebilirsin.

Buraya kadar okuduğun için teşekkür ederim. 

Selin.