Neden komut satırını öğrenmek lazım?

Komut satırı ve daha fazlasını öğrebileceğiniz YouTube kanalıma bir göz atabilirsiniz: https://www.youtube.com/tar%C4%B1kguneyphd

Öncelikle bir şeyi açıklığa kavuşturmak lazım: Neşter kullanması bilmeyen nasıl cerrah olamazsa, programlama araçlarını kullanmasını bilmeyen maalesef yazılım mühendisi olamaz. Yazılımcı olmak için sadece programlama dillerini bilmek yetmiyor. Bilakis, kullanılması gereken araçlar içinde daha geniş bir yelpaze karşılıyor bizleri. Bu yelpazeyi kullanacak yeterliliğe sahip olunmadığında ise, karşımıza bir yazılımcı değil, daha çok yazılımla hobi olarak ilgilenen insan profili çıkıyor. Peki ciddi bir yazılımcıyı sıradan bir yazılımcıdan ayıran fark nedir?: Kendisine devamlı yaptığı işi nasıl daha hızlı yapabilirim sorusunu sormak ve bunun heyecanını duymak. İşte bu anlayış, insanın mesleğini sevmesidir. İçinde bulunduğumuz yazılım sektörünü ve yazılım sektörünün etkilediği diğer tüm meslekleri bu günlere getiren sebeplerden bir tanesi de bu heyecandır. Yazılımın kendisini geliştirmediği başka bir meslek yok gibidir. Doktorları kendi kapasitelerinden çok daha ileriye taşıyan, inşaat sektörüne ve mimariye yeni bir çağ yaşatan, madenciliği yeniden tasarlayan yazılım mühendisliğidir. Tarihte başka meslekleri bu kadar etkileyip onlara çağ atladan başka mesleklerin sayısı maalesef çok değil. Yazılım mühendisliğinin kimsenin tartışmadığı çok kutsal tarafları var.

Belki sorabilirsiniz, neden bu yazıya bu cümleler ile başladın diye. Anlatacağım teknik kısımların ruhu olduğu için bu ifadeler. Bugün kullandığımız yüksek seviyede dilleri meydana getiren, bizi assembly ya da 010101 şeklinde kod yazmaktan kurtarıp bu mesleği daha zevkli ve anlaşılır hale getiren işte bu aynı heyecan. Komut satırını öğrenmek, işimi nasıl daha iyi yapabilirim sorusunu soranın alacağı cevaplardan bir tanesi olacaktır. Şimdi asıl konuma gelebilirim.

Kullanılacak araçlar yapılacak işe göre farklılık gösterse de, bu araçlar içinde tüm yazılımcılar için ortak olan araçlardan bir tanesidir komut satırı, daha doğrusu onunla neler başarabileceğiniz. Çoklarımız komut satırına bakarken aslında bir açıdan bakıyoruz; o da scriptable olması, yani içinde script yazılabilir olması. Ama bu özelliği çok farklı kullanım alanlarının da kapısını açmış oluyor.

Diyelim ki kullandığınız işletim sisteminizde subnet tanımlayacaksınız. Bunu nasıl yapacağınızdan emin değilsiniz ve google etmeniz sonucunda GUI kullanarak size yapılması gerekenleri adım adım anlatan bir makale ile karşılaştınız. Süper. Denilenleri teker teker yaptınız ve herşey çalıştı. Ama bir zaman sonra yeniden subnet eklemek ihtiyacınız çıktı. Belki de bir arkadaşınıza yardım etmeniz gerekti ya da bilgisayarınıza format attınız ya da bir tane virtual machine kurmanız gerekti. Aradan geçen zamandan dolayı da büyük bir ihtimal bu adımları çoktan unuttunuz. Nedeni her neyse, yapmanız gereken yeniden aynı adımları makalede dendiği gibi adım adım yapmak. Bazen gelecek ki bu, onlarca GUI penceresi ile çalışmak demek olacak. Bir sihirbazdan diğerine atlayıp duracaksınız. Tabi bunları yaparken onlarca screenshot içeren o upuzun makaleleri okumanın ve incelemenin sıkıcılığından bahsetmiyorum bile.

Eğer bu adımları komut satırı ile yapsaydınız, tek yapmanız gereken bu adımları ileride yeniden çalıştırmak üzere belki bir .bat dosyasına ya da .sh dosyasına kaydetmek olacaktı. Belki de bir saat ya da bir gününüzü alacak olacak bu adımlar, komut satırı kullanmak sayesinde bir kaç saniyenizi almış olacak.

Arkadaşınız sizden bir konuda yardım istedi. Kendisine saatlerce istediği şeyleri GUI ile nasıl yapabileceğini anlattınız. Belki de aynı problemle siz uğraşırken unutmayayım diye uzun uzun yazdığınız notlarınızı yada daha önceden bulduğunuz bir makaleyi paylaştınız onunla. Arkadaşınız verdiğiniz o notu anladı veya anlamadı. Ya da makaleyi okuyacak zamanı var ya da yok. Halbuki bunun daha kolay bir yöntemi var. Notlarınızı paylaşmak yerine komutlarınızı paylaşın. Hem daha kısa, hem direk çalışabilir, hem de adımları bir algoritma gibi okunabilir. Sonuçta bizler yazılımcıyız. Kod bizim için uzun uzun cümlelerden daha çok şey anlatıyor.

Küçük bir örnek
Github repolarının README.md dosyalarında aşağıda ki komutların benzerlerini görürsünüz çok defa:

Yukarıda ki komutlar, bir projeyi nasıl hızlıca indiribileceğinizi, kurabileceğinizi, ve sonra da çalıştırabileceğinizi anlatıyor. Şöyle geriye bir yaslanın ve eğer aynı bilgileri kod ile değil de, GUI ile anlatıyor olsaydınız, ne kadar screenshot, yazı, ve referans paylaşmak zorunda kalırdınız diye bir düşünün. Olayın büyüklüğünü görünce yukarıda ki komutların ne denli güzel olduğunu anlamaya başlıyor insan.

Redirection ve Pipelining gibi özellikler komut satırını vazgeçilmez kılan nedenler. GUI kullandığınızda size sunulan programa sıkışıp kalıyorsunuz. Mesela, kullandığınız uygulama, üzerinde bulunan verileriniz arasında arama yapmanıza destek vermiyorsa? Hele bir de verilerinizi bir dosyaya export edemiyorsanız, yandınız demektir. Linux komut satırı üzerinde bu tür işlemler çoğu zaman gayet kolay. Tamam, komut satırında kullanılabilecek uygulamaları ve bunların nasıl çalıştığını biraz öğrenmek gerekiyor. Ama 10 sene GUI ile kasmak yerine, öğrenmesi 3 sene bile alsa, o zamanın sonunda geriye kalan 7 seneyi çok daha verimli geçirebileceğiniz bir ortam öğrenmiş oluyorsunuz. Pipelining nedir diye soranlar varsa:

şeklinde bir komutu inceleyelim. ls komutu, içinde bulunulan klasörde ki tüm dosya ve klasörleri listele demek. -a ise gizli olanları da getir demek. | ise pipelining operatörü, yani ls -a komutundan gelen çıktığı ekrana yazdırmak yerine grep komutuna gönder demek. Daha teknik olarak, ls komutunun stdout’unu grep’in stdin kısmına bağla demek. grep ise text aramak için kullanılan bir komut. Kendisine verilen dosyalar içinde istenilen bir veriyi arayabiliyor. Burada ise ^a regex ifadesi. Yani a ile başlayan satırları getir demek. Komutla 11 harfle yazdığım şeyleri anlatmak bile ne kadar kelime gerektirdi. Gerisini siz düşünün. Bu komutu istediğim kadar çalıştırabilir; not alırken, yüzlerce kelime kullanmak yerine, sadece bu komutu notlarıma yazabilir, ve onlarce ekran çıktısı ile uğraşmak yerine, bu komutu istediğim yerde saklayabilirim. Arkadaşlarınız ile paylaşmak istediğinizde, şu uygulamayı aç, oradan şuna tıkla, sonra şuraya, sonra buna vs. demek yerine bu komutu gönderiyorsunuz ve bu kadar. Sonradan bu komutu istediğiniz başka komutlar ile birleştirebilir ve daha gelişmiş komutlar yazabilirsiniz… Hatta bu komutun size dönderdiği çıktığı kaybetmek istemiyor ve onun bir dosya olarak saklamak ve paylaşmanız gerekiyorsa, o zaman:

> results.txt eklemesi ile bunu rahatlıkla yapabilirsiniz. > redirection operatörü. Bir çıktıyı ekrana yazdırmak yerine, bir dosyaya yazıyor.

Komut satırı kullanmak ile uzaktaki bir makineyi kontrol etmek çoğu zaman GUI ile Remote Desktop yapmaktan çok daha rahat oluyor. Eğer internetiniz yavaş yada birden fazla uzak masaüstüyle aynı anda uğraşmak zorundaysanız, demek istediğimi çok daha rahat anlayacaksınız. Ek olarak, aynı ayarları 10 tane makine üzerinde yapmanız gerekiyorsa, komut satırında önceden kaydettiğiniz kodları hızlıca çalıştırmak yerine GUI kullanmak intihar demektir. İnanmayan buyursun Halil İbrahim sofrasına.

Daha çok neden yazılabilir. Ama bazı şeyler o kadar önemlidir ki, diğer nedenler devede kıl tüy kalır. Bence bu nedenler gayet önemli olanlarıydı. Varın kullanıp kullanmamak istediğinize siz karar verin.

Başka mühendislerin kullanacağı yardımcı uygulamalar yazdığınızda, GUI tasarımı ve bakımı ile zaman kaybetmek istemezsiniz. Zahmetli iştir o kadar seçeneği insanların rahat bir şekilde anlayıp kullanacağı şekilde GUI üzerinde tasarlamak. Onun yerine console uygulaması yazarsanız, hem zamanınızı uygulamanızı daha iyi çalışabilir hale getirmek için harcamış olma şansınız olur, hem de programınız script edilebilir olur. Bir taşla iki kuş. Yazılımcılara hitap eden uygulamalar genelde önce komut satırında kullanılabilecek şekilde geliştirilir. Docker, Git, Mercurial, MSBuild, GCC, vs. ismini siz koyun.

Redirection ve Pipelining dışında, komut satırı uygulamalarını kendi kodlarınız içinden bile çağırabilirsiniz.Mesela dotNet Core ile yazdığınız uygulamadan *Nix (aka. Un*x, Unix-like) işletim sistemleri üzerinde çalışan ls, grep, wc, vs. gibi komutları çağırabilir, ve farklı teknolojiler ile geliştirilmiş uygulamaları birbirleri ile konuşturabilirsiniz. Bu arada ls, grep, vs. bu komutlar aslında birer program. Bunuda buradan söylemiş olayım.

Beni takip edenler arasında üniversiteye giden genç arkadaşlar var. Komut satırının önemini onlara şöyle anlatabilirim. Öğrencisi olduğunuz üniversitenin kaliteli eğitim verip vermediğine size komut satırı öğretip öğretmediklerine ve profesörlerinin programlama derslerinde ne kadar komut satırı kullanıyorlar, bunlara bakarak karar verebilirsiniz. Ne kadar çok komut satırına muhatap kalıyorsanız, o kadar da kaliteli bir eğitim alıyor olabilirsiniz demektir. Aksi halde, bu sorunu düzeltmek için bir şeyler yapmanızı tavsiye ederim.

Bu yazıdan GUI kötüdür manası çıkmasın. Komut satırı mühendisler ile genel geçer kullanıcılar arasında ki ilk çizgilerden bir tanesidir sadece. GUI çoğu şeyi herkes için kullanılır kıldı ama bu mesleği yapanlar herkes kategorisine girmiyor. Bu mesleği yapanlar, herkesin kullandığı yazımları geliştirenler kategorisine giriyor. Dolayısıyla yazılımın fiziksel kanunları bizim dünyamızda daha farklı işliyor.

Bir sonraki yazımda görüşmek üzere, esenlikle kalın.

Senior Manager in Software Engineering. Former Technical Lead. Author of the book: Hands-on with Go http://amzn.to/2QYFoaV YT: http://youtube.com/c/tarikguney

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store