Yazılımla ilgili boş mevzular(!)

Bu çiçeklerin konuyla alakası yok:)

Normalde bu blogu bilgisayar bilimleri konularını tekrar ziyaret ederken aldığım notları paylaşmak için kullanmayı planlıyordum. Ancak bir hafta önce bu kadar etkileşim alacağını düşünmediğim, sınıfsal açıdan dezavantajlı başladığım ve sonra cinsiyet sebebiyle yaşadığım birkaç ayrımcı örnek ile yazılımcılık serüvenimi anlatan bir tweet dizisi paylaşmıştım. Birçok kadının benzer sebeplerden ya kendine güvensizlik yaşadığı ya da komple sektörü bıraktığını da böylece öğrenmiş oldum. Ben kendim bununla nasıl başa çıktım ve aslında olması gerekenin ne olduğunu elimden geldiğince anlatmaya çalıştım.

Neredeyse dokuz yıl oldu bilişim sektöründen ilk paramı kazanmaya başlayalı. O günden bu yana altı farklı şirkette/kurumda, üç farklı şehirde ve iki farklı ülkede çalıştım. Sayısını şimdi pek hatırlayamadığım kadar iş görüşmesine girdim. İş görüşmelerinde masanın her iki tarafında da yer aldım ve her iki tarafında da kimi zaman cinsiyetimden ötürü kimi zaman etnik kökenimden dolayı ayrımcılığa uğradım. Tabiki bunu kimi zaman ilk anda kimi zaman üzerinden çokça zaman geçip kendinizi defalarca sorguladıktan sonra farkediyorsunuz. Her iki durumda da kesinlikle insanı hem iş yaşamında hem özel hayatında hasta eden bir durum. Bir sesimin olmadığını ve bunun suçlusunun kendim olduğunu düşünerek geçti zamanımın çoğu.

Şu anki ‘ben’e ulaşana kadarki uğraşlarım

  • Çok çalışmak: Bunun gerçekten bir sonu yok. İlk işe başladığım dönemlerde neredeyse yalnızca 3-4 saat uyuyordum. Bütün hayatım işti. O dönem bana dayatılan başarı kriterinin gerçekçi olmadığını ve yapılanın zorbalık olduğunu çok sonraları farkettim. Kaldı ki iş yerinde yaptığınız her iş size bir şeyler katacak diye bir şey yok. O yüzden işi mesai saatleri içerisinde bırakıp geri kalan kısmı kendi ilgi alanınıza uygun kullanmak daha doğru olacaktır.
  • Yan projeler yapmak: Çaylaklık dönemi insanın yeni bir şeyler öğrenmek için motivasyonunun en yüksek olduğu dönem. O sebeple iş yerinde yaptıklarınız ile alakalı veya değil sadece meraktan kendi zamanınızın bir kısmını bu tarz projelere ayırmak hem kendinizi tanımak hem de neler yapabileceğinizi görmek açısından iyi bir yöntem. Ben de öyle yaptım. Öncelikle kendime ait zamanımın olmasına izin verecek şekilde çalıştığım şirketi değiştirdim. Sonra özgür yazılımlar geliştirerek ve konferanslarda eğitimler vererek iş yerimde bulamayacağım deneyimler edindim.
  • Dil kursu: Akıcı ve akademik seviyede İngilizce konuşmaya kafayı takmıştım. Bunun sebebi aslında sonunda bir planım olması değildi. Bunca yıl İngilizce eğitimi alıp konuşmaya gelince zorlanmak bana çok saçma geliyordu ve bunu bir şekilde halletmeliydim. Kursa gittim o sebeple ama yeterli gelmedi. Günlük hayatta kullanmadığın dil ana dilin bile olsa köreliyor. Dolayısıyla günlük yaşantımda kullanmaya beni zorlayacak bir iş arayışı beynimin içinde çanlarını çalmaya başlamıştı. Onun öncesinde Amerikalı bir arkadaşımla düzenli olarak pratik yaparak bunu aşmaya çalıştım.
  • Uluslararası bir firma deneyimi: Yaptığım yan projelerin ve toplulukta aktif rol almamın da yardımıyla uluslararası bir firmada işe girdim. Çalışanlara sağlanan eğitimler, farklı kültürlerden ve coğrafyalardan insanlarla çalışma deneyimi bir firmanın sağlayabileceği bütün imkanları sonuna kadar kullandığımı düşünüyorum.
  • Yurtdışı deneyimi: Çocuk sahibi olduktan sonra hem İstanbul’da kurulması zor iş-yaşam dengesini kuramamaktan hem de çocuğumuzun geleceği için kaygılarımızdan dolayı yurtdışına taşınmaya karar verdik. Elbetteki herkesin bu konuda farklı görüşleri olabilir. Ama en azından birkaç yıl farklı ülkelerde (özellikle sosyal açıdan gelişmiş olanlarında) deneyim kazanmak hem kendi ülkene uzaktan baktığında nelerin daha iyi nelerin çok çok daha kötü ve nelerin gerçekten iyileştirilebilir olduğunu görmek açısından mutlaka yapılması gerek. Teknik gelişim için uzaktan çalışma da bir seçenekken kişisel gelişim açısından başka ülkede yaşama deneyiminin imkanı olanların kesinlikle yaşaması gerektiğini düşünüyorum.
  • Sonuç: Artık neyi bilip neyi bilmediğimin farkındayım. Hiç kimsenin mükemmel olmadığının ve olamayacağının farkındayım. Fikirlerimi çekinmeden söylemem gerektiğinin ve onları destekleyici sağlam argümanlarla sonuna kadar savunmam gerektiğini, yanılıyor olsam bile sonunda doğrusunu öğreneceğimi biliyorum. Tartışma kültürü olmayan insanlarla ve sağlam bir argümanı olmamasına rağmen ikna olmaya asla yanaşmayan insanlarla tek başıma uğraşmıyorum mesela artık. Alınacak kararlardan sorumlu kim varsa dahil edip sorunu beraber çözmeye çalışıyorum. Birlikte çalışması mümkün olmayan insanları tek başıma düzeltmeye çalışmıyorum. İşi işte bırakıyorum.

Teknik konular konuşalım vaktimizi neden buna harcıyoruz?

Yazılım geliştirme bir yazılım projesini zamanında ve düzgün teslim etmeyi, mimari tasarımı, kullanılacak araçlara karar vermeyi, yazılımı ihtiyaca uygun yeniden şekillendirmeyi, ihtiyaca zamanında cevap verebilmeyi vb. kapsar. Hepsinin başarılı bir şekilde yerine getirebilmenin yolu insanlar arasındaki ilişkilerden geçiyor. Siz iyi bir yazılımcı olmayı bir programlama dilini, bir aracı, bir framework’ü, bilgisayar organizasyonunu/mimariyi, işletim sistemlerinin çalışma prensiplerini çok iyi bilmek olarak düşünüyorsanız çok feci yanılıyorsunuz. Hepsi teknik konularda kıdemli olup birbiriyle iletişim kuramayan, işi bitirebilmek için yeterli aidiyet hissine veya motivasyona sahip olamayan, veya tam tersi tek başına projenin büyük bir kısmını üstlenip en kötü ihtimalle projeyi batırıp en iyi ihtimalle projeyi kaçınılmaz tek insana bağımlılık (bus factor) kaderine mahkum eden insanlardan oluşan ekiplerle çokça karşılaşmanız işten bile değil. Kısacası demek istediğim yazılım yaşam döngüsü insan bağımlıdır. İnsanı etkileyen her konu aynı zamanda tekniktir de. Bir projenin başarılı olması için insanların iş yerindeki refahına, motivasyonuna, özel yaşantısındaki kaygılarına göbek bağı ile bağlısınız.

Ne yapalım?

  • Dezavantajlı durumdaki gruba dahil iseniz, örgütlenmek, sizinle benzer dertlerden müzdarip insanlarla bir araya gelip ortak akıl oluşturarak eylemlerde bulunmak, görünür olmak, farkındalık yaratmak zaten yüz yıllardır bilinen ve işe yarayan bir pratik. Bunun yanında enerjimizi kendi küçük dünyası içinde mutlu, bir başkasıyla empati kuramayacak seviyedeki ve elbetteki sizi anlamaya hiç niyeti olmayan insanlara harcamak kendinize yapacağınız büyük bir kötülük olur. Muhattabımız kişiler değil sistem olmalı.
  • Ayrıcalıklı gruba dahil olanlar ve dezavantajlı gruptakiler ile dayanışma içerisine girmek isteyenler iyi niyetli de olsa akıl vermek yerine onların taleplerini ve hikayelerini görünür kılmayı denemeliler.
  • İş verenler/yöneticiler/kurumlar/şirketler: adaletin sağlanması ve herkesi kapsayan bir yapının benimsenmesi iş yerindeki refahı arttıracağı için çok sesliliği, deneyim çeşitliliğini, problemlere alternatif çözümleri beraberinde getirip eleman bulamamayı, bulunan elemanı elden kaçırmamayı da çözecektir. Bunu sadece dezavantajlı gruptan ‘sembolik’ veya ‘göstermelik’ istihdamlar yapmak ile değil halihazırda var olan çalışanlarınızın da kurum içerisinde yeterince temsil edilip edilmediğinden emin olup olası problemlere mümkün olduğunca çözüm getirmek ile de yükümlüsünüz. Bu durumda yine en karlı çıkan siz oluyorsunuz:)

A failed interview with Amazon

Hi, I am Maki, one of Özge’s cats. I am going to be the storyteller. Here, her very-first-and-embarrassing-at-the-same-time story in this blog. Hope it will be the last one:)

As far as I knew she wasn’t searching for a new job when she received a message from Amazon.es recruiter. It had been only one year and three months since we moved to this new country (Figure 1). Hence I wouldn’t expect her to say “yes” to an interview request that might end up with moving to a different country again. She did it though.

Figure 1: Haarlem, the Netherlands

She wasn’t ready I knew. But instead of taking a nap next to me when she had free time that remained from her little son, she decided to go with the flow. I heard she was saying “It’s time to blow the cobwebs away”.

First step: sending resume to recruiter’s email address

Even if they write to you to make an interview, they decide whether to proceed with the interview after they see your resume that is more detailed than your LinkedIn profile.

Second step: online coding assessment

They sent her a detailed email with a link to an online assessment system. She only had 90 minutes to finish the assessment after she started it. 75 min for two coding questions and 15 min to discuss in terms of complexity.

Online assessment system allows you to run your code with predefined test cases. You can not write your own tests or you can not see the tests’ inputs and expected outputs, of course. It’s expected from you to consider edge cases and optimal and alternative solutions.

Questions were like these as far as I remember:

1- Consider a string that is from a search box and a word list to be ignored. Find all the most recurring words in the sentence.

2- Write a function to find the number of scenes in a video. Every image in a video is represented by a char, and an array represents a video. For example:

Example 1:

Input: [‘a’, ‘c’, ‘g’, ‘a’, ‘c’, ‘d’, ‘e’, ‘j’, ‘f’, ‘e’, ‘d’, ‘j’, ‘f’, ‘h’, ‘i’, ‘h’, ‘k’, ‘i’ ]

Output: 3

Example 2:

Input: [‘a’, ‘j’, ‘d’]

Output: 3

She couldn’t manage her time, and wasted most of it on first question, but at least she filled discussion part for both questions.

She was so disappointed while filling my food bowl and she forgot to pet me after she finished the assessment. However she got a response real quick from recruiter just a day after it to proceed with the next step. That email also contained several questions like salary expectation, first three preferred location out of EMEA dev centers, would there be any barriers to you accepting etc.

Third Step: phone interview

Phone interview took 60 min. First part is about leadership principles and behavioral questions, second part was live coding while talking with your interviewer.

She was practicing Amazon’s leadership principles while preparing for the interview. I saw her writing to her notebook very harshly and murmuring while I was starving to death. Fortunately she also remembered her purpose of life and fed me.

As she also read what she wrote out loud, I could catch that she structured her stories in STAR (Situation, Task, Action, Result) form.

Part 1- Leadership principles and behavioral questions:

1- Tell me about a time when you inspire other team members.

2- Tell me about your role in the team.

3- What is the very first thing that you solved in your recent company.

First part passed smoothly.

Part 2: Coding

This was epic fail. I saw that she even forgot basic math. In 20 min she had to start with brute force approach and to find the optimal solution while discussing every step with her interviewer. It was very challenging for her since she always had her time to think about solutions in her own mind while she is all alone there.

Question was this:

Write a function that will take an integer called ‘target’ as the input and return the minimum number of steps that needs to be taken to reach that target from 1. In every step, allowed operations are: add 1, multiply by 2 or multiply by 3.

The day after, she got that negative email.

Lessons learnt

Learning from mistakes is an expensive process, especially when what needs to be done is obvious. On the other hand such experiences takes you out of your comfort zone and face you with how much you immerse yourself into your daily job. Beside that it can help you to show the path how you can become better you at your job.

What’s Next?

So after these lessons, she decided to revisit CS topics in daily bases and assigned me a continuous task to create stories out of that and publish them in this website. (I took these topics from Amazon‘s software development topics):

* Programming language: You have to know the internals of your preferred programming language like memory management, commonly used collections, libraries. It will save you a lot if you know all the Big O complexity of the operations over data structures implementation in your preferred language. It will help you a lot while analyzing your code. For Python: https://wiki.python.org/moin/TimeComplexity

* Data structures: Revisit the complex data structures and their implementation like trees or graphs.

* Algorithms: Knowing the common concepts will accelerate your coding skills. There is no need to reinvent the wheel every time.

* Coding: Practice with these web sites:

     https://leetcode.com/

    https://www.hackerrank.com/

     https://www.codingame.com/

* Operating systems:  memory management, processes, threads, synchronization, paging, and multi-threading

* Object-oriented design: It’s a good idea to revisit design patterns. Even if you may already be familiar with all these concepts from experience, having a comprehensive knowledge about that will help you to better defend your solutions and design. Thus Clean Code, Code Complete, Programmatic Programmer are the books needs to be read.

* General ML and AI

* Databases: Being familiar with the database alternatives and their use cases will help to better solve the system design questions. This wiki page may be good starting point: https://en.wikipedia.org/wiki/Database

* Distributed computing: service-oriented architectures, map-reduce, distributed caching, load balancing, and others. Wiki page can be a good starting point to create a roadmap: https://en.wikipedia.org/wiki/Distributed_computing

* Internet topics: General understanding how internet is working.

Useful resources:

https://github.com/kdn251/interviews

https://www.geeksforgeeks.org/