tag:blogger.com,1999:blog-8947426621768187552024-03-25T13:54:17.086-07:00Programlamaya Dair PaylaştıklarımProgramlama Dünyammalik masishttp://www.blogger.com/profile/06624991798770591895noreply@blogger.comBlogger173125tag:blogger.com,1999:blog-894742662176818755.post-78171788475101974462024-03-21T15:10:00.000-07:002024-03-21T15:20:51.214-07:00Kimle Pair Çalışmalı?<p> <span> S.A. Arkadaşlar,</span></p><p><span><span> Son haftalarda canlıda meydana gelen problem için takım arkadaşım Ceyda ile birçok kez birlikte çalışıp hatanın sebebini bulmaya çalıştık. Kendisi benden yaşça oldukça genç olmasına rağmen kendisinden çok şeyler öğreniyorum. En son yukarıda bahsettiğim hatada yine güzel bir bakış açısıyla odağımızı farklı bir noktaya kaydırınca bu yazıyı yazmaya karar verdim. Hazırsak başlayalım.<span></span></span></span></p><a name='more'></a><span> Pair programming nedir, faydalarından ve eksikliklerinden ziyade kimlerle yapıldığında daha verimli olur, kimlerle yapılmamalı ya da yanlış olabilecek birkaç noktadan naçizane bahsetmek istiyorum. </span><div><br /></div><div><span><span> Pair çalışırken ekranını paylaşan kişiye driver(yazan), onu izleyen ya da yönelndiren kişiye ise navigator(yönlendiren)</span> diyebiliriz. Hem yazan hem de yönlendiren olmanın farklı avantaj ve dezavantajları var. En basitinden yazan kişi kodlama yaptığı için daha dinç ve aktif kalabilir, buna karşılık yazmaya odaklandığı için farklı bakış açılarını kaçırabilir. Yönlendiren kişinin de olaydan kopma gibi bir handikapı var iken kodu yazmadığı için o anda farklı pencereden güzel noktalar yakalama şansı olur. O yüzden bu çalışmayı mümkün mertebe rolleri değiştirerek yapmak daha sağlıklı olacaktır.</span></div><div><br /></div><div><span> 2 takım arkadaşım son dönemlerde birlikte çalışıyorlardı. Kodu yazan kişi projeye daha hakim iken yönlendiren arkadaşım ise daha sonradan işe giren ve projeye dahil olmaya çalışan kişi. Projeyi bilen insan doğal olarak koda olan hakimiyeti ve geçişleri daha hızlı yapabilmektedir, bu da takip eden kişiyi bir yerden sonra yorabilir veya sıkılmasına sebebiyet verebilirdi. Bunu fark edince rolleri değiştirmelerini, başta biraz yavaş yol alınsa da bunun sorun olmayacağını ama daha verimli olabileceğini ilettim. Bunu yaptıktan sonra geri dönüşleri çok daha olumlu olmuştu.</span></div><div><br /></div><div><span> Daha önceleri yeni işe başladığım bir firmada, yurtdışından bir proje almıştık (şirket de yeni kurulduğu için doğal olarak bu müşteriyi çok önemsiyorduk). Projeye alışıp işi yoluna koyana kadar iş verenimle birlikte pair çalışıyorduk. Orada kodu yazan ben yönlendiren pozisyonunda ise kendisi vardı (Kendisi benden çok daha tecrübeli, uzun yıllardır sektörde farklı pozisyonlarda çalışmış biri). Beraber güzel çalışıyor olmamıza rağmen 2-3 günden sonra kendisinin çok yönlendirdiğini bu yüzden benim biraz daha pasif durumda kaldığımı, özgüvenimi etkilediğini ilettim (daha önce de birlikte çalışmış olduğum biri olduğu için bunu rahatlıkla ifade edebildim). Yönlendirmelerini daha az yapmasını rica ettim. Kendisi de bunun farkında olmadığını ve buna dikkat edeceğini söyledi. Gerçekten de bu noktadan sonra hem projeye olan hakimiyetim arttı hem de kendisi sadece gerektiği yerlerde fikirlerini belirtti ve böylece güzel bir çalışmayı ilerletmiş olduk.</span></div><div><br /></div><div><span> Giriş kısmında kısaca bahsettiğim konuya dönecek olursak, takım arkadaşım bu sefer benden oldukça genç biri. Bir üstteki örneğe kısmen benzer. Bazen rolleri değiştirsek de genelde yazan Ceyda olur iken yönlendiren/izleyen ise ben oluyorum. Mümkün mertebe yukarıda bahsettiğim hataya düşmemeye çalışıyorum, zaten uzun süredir de birlikte çalıştığımız için aslında birbirimizi çok da iyi anlıyoruz. Uzun süredir kafama takılan bir konuda ben yazmaya başlamıştım ki kendisiyle pair olmaya ve çoğu zamanın aksine rolleri değiştirerek ilerledik. Sürekli aynı noktaya odaklanmıştım. Ceyda bir de şunu mu düşünsek dediğinde gözüm ışıldadı ve bu bahsettiği yolla problemin üzerine gittik ve ciddi manada yol almamız vesile oldu.</span></div><div><span><br /></span></div><div><span><span> Konuyu özetlemek gerekirse 3 farklı örnek ve farklı tecrübelerde birbiriyle çalışan kişi ve olaylardan bahsettim. Burada bahsedilen teknoloji, tecrübe (teknik olarak aklınıza her ne geliyorsa) den ziyade "soft skill" dediğimiz kişisel özellikler ve o çalışan 2 kişinin uyumu çok daha önemli olabilmektedir. Yazan da yönlendiren de geri bildirimlere açık olmalı, kibire kapılmamalı ve egolarına yenik düşmememlidir. Zaten böyle yapılan pair çalışmalar hem verimli olmayacak hem de tekrarı gelmeyecektir diye düşünüyorum. </span><br /></span></div><div><span><span><br /></span></span></div><div><span><span><span> Ayrıca bu gibi birlikte çalışmaların hem teknik olarak çok faydası var, hem de birlikte çalışan kişilerin ekip içindeki uyumu, birbirine olan bağlılıkları/inançları da o ölçüde artabiliyor. Takımdaki iletişimin ve uyumun, o takımdaki yetenekler toplamından çok daha önemli olduğuna birçok kez şahit oldum ve muhtemelen de şahit olmaya devam edeceğiz.</span><br /></span></span></div><div><span><span><span><br /></span></span></span></div><div><span><span><span><span> Nice güzel birlikte çalışmalar gerçekleştimek dileğiyle. Kendilerinden bahsettiğim arkadaşlarıma da sevgiler/saygılar</span><br /></span></span></span></div><div><span><span><span><span><br /></span></span></span></span></div><div><span><span><span><span><span></span></span></span></span></span><blockquote><span><span><span><span><span> "</span></span></span></span></span>Mü’minler birbirlerini sevmekte, birbirlerine acımakta ve birbirlerini korumakta bir vücut gibidirler." (Müslim, Birr, 17)</blockquote></div><div><span><span><span><span><span><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEj82R-OeM1HmLetuBtSgMomPNbPMzi_mQ0tKndH1EBTOXSxSVfiYvpOpseexB9wB423l_yFuQcQwqZMnApG20nTrm7u46qgrEmRXy-Hj2W545bm_hjQNSeshmsVAcbImCtZnnpTU6e8TPo_Uf0YIthLFy9Gf7ktDP_G-FvbtTvRQMQCQtqik5o0WwrRjB6z" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="620" data-original-width="600" height="640" src="https://blogger.googleusercontent.com/img/a/AVvXsEj82R-OeM1HmLetuBtSgMomPNbPMzi_mQ0tKndH1EBTOXSxSVfiYvpOpseexB9wB423l_yFuQcQwqZMnApG20nTrm7u46qgrEmRXy-Hj2W545bm_hjQNSeshmsVAcbImCtZnnpTU6e8TPo_Uf0YIthLFy9Gf7ktDP_G-FvbtTvRQMQCQtqik5o0WwrRjB6z=w619-h640" width="619" /></a></div> </span></span></span></span></span></div>malik masishttp://www.blogger.com/profile/06624991798770591895noreply@blogger.com0tag:blogger.com,1999:blog-894742662176818755.post-16352756499037118102024-03-20T14:17:00.000-07:002024-03-20T14:31:52.240-07:00Yeterince Profesyonel Miyim?<p> <span> S.A. Arkadaşlar,</span></p><p><span><span> En son söyleyeceğim sözü en başta söyleyeyim, sanırım değilim. Peki olmak istiyor muyum, sanırım istemiyorum. Neden mi? Öyleyse başlayalım<span></span></span></span></p><a name='more'></a><span><span> Öncelikle bu kelimenin altını nasıl doldurduğumuza bakmamız lazım. Birçokları bu konuda farklı tanımlar yapabilir veya birçoğunun kafasındaki profesyonellik anlayışı farklı olabilir. Öncelikle ben profesyonellik deyince aklıma neler geliyor ondan bahsedeyim sonra da diğer bazı noktalara değiniriz.</span></span><p></p><p><span><span><span> Profesyonellik denince herhalde insanın ilk aklına gelenlerden biri, olayları duygusal olarak değil akıl ekseninde ele almak gelir. Yani kalpten ziyade aklı ön plana koymak olarak nitelenebilir diye düşünüyorum. Bunu nasıl yönettiğimiz de bir o kadar önemli. Safi akıl insanı acımasız yapabiliyor iken safi kalp ise insanı zor durumlara düşürüp işi yönetemez hale getirebilir. Her konuda olduğu gibi yine dengeyi gözetmekte fayda var. Bu dengede ben kendi adıma kalbi mümkün mertebe üstün tutmamaya çalışıyorum. Bunun nedeni yukarıda da bahsettiğim gibi bu işi yapabilmenin her iki yolu da var iken başka birini kırmaktansa bunu farklı şekillerde halledebilceğimi düşünüyoru olmam.</span></span></span></p><p><span><span><span><span> Geçenlerde yaşadığım bir olay. Arkadaşlardan biri diğerinin kodunu ezerek kendi kodunu canlıya gönderdi. Kodu ezilen arkadaşın yöneticisi hesap sorunca, o da dönüp arkadaşına böyle bir şey var adını versem senin için sorun olur mu diye soruyor. Kodu ezen arkadaş da tabii ki ben hata yaptım, hiç problem yok dedi ve konu tatlıya bağlandı. (Ben bir hata varsa kişiyi suçlamaktan ziyade sistemin buna nasıl müsade ettiğini veya bir sonraki sefer bunu nasıl engelleyebileceğimiz üzerine daha çok odaklanırım. Eski işverenime de buradan selamlar, bu konuda hatayı yapanı değil buna müsade eden sistemi geliştirmek üzerine yorum yapardı.)</span><br /></span></span></span></p><p><span><span><span><span><span> Yukarıdaki olayda aslında sıradışı bir şey yok benim açımdan. Bahsettiğim arkadaş grubu oldukça samimi olan arkadaşlar. Konu profesyonellikten açılınca kodu ezen arkadaş orada bana sormasına bile gerek yoktu, bir hata varsa bu söylenir, bunda kırılacak darılacak bir durum yok, bende olsa ben de aynısını danışmadan söylerdim dedi. Mantıklı düşüünnce aslında haklı, belki de olması gereken odur, fakat duygusal düşününce diğer arkadaşın yaptığı ona bir şey mi kaybettirdi peki? Şimdi buradaki soru, hangisi daha profesyonelce hangisi daha insani bir davranış? Yorumu sizlere bırakıyorum...</span><br /></span></span></span></span></p><p><span><span><span><span><span><span> Millet olarak duygusal insanlar olduğumuzu kabul etmek lazım. Çokça duyduğumuz kodun sen değilsin, koda gelen eleştiriler size değil kod için söylenmiştir dense de bunu bir türlü aşamayıp fazla tepkiler verebiliyoruz. Yapıcı eleştirinin veya geri bildirimin önemi çok fazladır ve bu tarz noktalarda mümkün mertebe duygusal davranmamak doğru olan davranıştır. Burada profesyonel olmakta fayda var, ama masanın </span></span></span></span></span></span>diğer tarafındaki kişinin profesyonellik ile acımasızlığı da birbirine karıştırmaması gerekmez mi sizce de?</p><p><span><span><span><span><span><span><span> Ya da başka bir örnek. Bir takım liderinin birlikte çalıştığı arkadaşınn gelişimine katkı vermesi hem insanı bir davranış hem de profesyonellik olabilir. Peki bunun nasıl yaptığının hiç mi önemi yok? Yardım ederken bile sert ve ciddi olmak mı bu geri bildirimleri daha akılda kalıcı kılar, yoksa naif bir şekilde daha yol göstererek mi? Ya da olması gerekenden biraz daha fazla el uzatmak mı profesyonellik dışıdır?</span><br /></span></span></span></span></span></span></p><p><span><span><span><span><span><span><span><span> Profesyonellik, kıvamına göre tabii ki güzel bir şeydir, ben her ne kadar öcü gibi göstermek yanılgısına düşmüş olsam da... Ancak o ince teraziyi kaçırdığınızda kapitalizme, zulme, kul hakkına çok yakın olduğunuzu hatırlatmakta fayda var. Bunları yapıp "profesyonellik" perdesinin arkasına saklananlara mı yoksa sözüm...</span><br /></span></span></span></span></span></span></span></p><p><span><span><span><span><span><span><span><span><span> Arkadaşlarım ve yöneticilerim benim yumuşak bir ekip lider olduğumu ve gerektiğinde biraz daha katı mı desem sert mi desem (artık siz nasıl ifade edersiniz, belki biraz profesyonel de diyebilirsiniz) olmam gereken durumlar olabileceklerini ilettiler. Kendilerine bu yorumlar için teşekkür ettim, ama o an düşündüm, gerçekten de gerektiğinde böyle mi olmalıyım? Böyle olmadan ben bu işi yapamaz mıyım? Onlara göre böyle kalırsam benim çok üzüleceğimi ilettiler, peki onların dediği gibi olsam ben daha çok üzülmez miydim? İnandığım gibi değil de olduğum gibi inanmaya başlamaz mıydım? Belki de çoğunluğun aksine profesyonel olmakla değil, olmamakla yetineceğim.</span></span></span></span></span></span></span></span></span></p><p><span><span><span><span><span><span><span><span><span><span> Ali İmran 159'da Allah Resulüne ne diyordu:</span></span></span></span></span></span></span></span></span></span></p><p><span><span><span><span><span><span><span><span><span><span></span></span></span></span></span></span></span></span></span></span></p><blockquote><span><span><span><span><span><span><span><span><span><span>"</span></span></span></span></span></span></span></span></span></span>Sen onlara sırf Allah’ın lütfettiği merhamet sayesinde yumuşak davrandın. Eğer kaba, katı kalpli olsaydın, hiç şüphesiz etrafından dağılır giderlerdi."</blockquote><p></p><p><span> Hz Ali (r.a)'ye isnat edilen bir sözde ise:</span><br /></p><p><span></span></p><blockquote>"Bin defa mazlum olsan da bir defa zalim olma. Bin kere mazlum olmak, bir kere zalim olmaktan iyidir." </blockquote><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbmz88nH3RF3XfkClgLg2-sDa_0jmcbhdJLRjF8c968u1hI6N-xuTK0jQAkYxquNA9XSrphQjwISrKdSvvx523WkQMYo3gg5i1wKA_Xt-2kKBNqEotdmzxLnt3sxxTDY3BonFINU523pIR7Sb19ZYhGXsNYOs79WUnLTsVGIOSn7rvjHUg_XhdgqZAaWcm/s620/free-palestine-quds-vector-illustration-600w-1970687537.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="620" data-original-width="600" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbmz88nH3RF3XfkClgLg2-sDa_0jmcbhdJLRjF8c968u1hI6N-xuTK0jQAkYxquNA9XSrphQjwISrKdSvvx523WkQMYo3gg5i1wKA_Xt-2kKBNqEotdmzxLnt3sxxTDY3BonFINU523pIR7Sb19ZYhGXsNYOs79WUnLTsVGIOSn7rvjHUg_XhdgqZAaWcm/w620-h640/free-palestine-quds-vector-illustration-600w-1970687537.jpg" width="620" /></a></div><br /><p></p>malik masishttp://www.blogger.com/profile/06624991798770591895noreply@blogger.com0tag:blogger.com,1999:blog-894742662176818755.post-3755355010121375402024-03-12T13:19:00.000-07:002024-03-12T14:59:05.479-07:00Tecrübe İnsanı Yavaşlatır Mı?<p> <span> S.A. Arkadaşlar,</span></p><p><span><span> Bugün biraz dertli olarak bir konuyu ele alacağım. Olan problemi hala çözmüş değiliz, ancak sıcağı sıcağına bazı notlar paylaşmak istiyorum. Bazen olay bu kadar sıcak iken doğru sonuçlar çıkmayabilir, ama o andaki düşünce ve psikolojik durumu anlamak ve bunu daha iyi yönetebilmek adına belki güzel ipuçları içerebilir. Hazırsak başlayalım.<span></span></span></span></p><a name='more'></a><span> Bir önceki gün, uzun süredir üzerinde çalıştığımız platform değişikliği (AWS -> GCP) ile ilgili son testleri tamamlamış ve hataları çözmüştük. Kanallardan gerekli bilgilendirmeler yapmış, gelen tebrikleri kabul ediyorduk. Her şey çok güzeldi. Canlı geçişleri için planlamalar konuşmalar da bir yandan devam ediyordu, fakat bu farklı bir problem yüzünden çok da uzun sürmedi...</span><br /><p></p><p><span><span><span> Sabah üzerinde çalıştığımız IoT projesindeki servislerle ilgili saptamaya çalıştığımız birkaç nokta vardı, bizler de belirli yerlere log kayıtları ekleyerek durumu tespit etmeye çalışacaktık. Ne olacak ki 2-3 tane log attık sadece deyip gün içinde çoğu zaman yaptığımız gibi canlıya çıktık (CI/CD işlemleri ile mikroservisleri koşturduğumuz için bu bizim çok büyütülecek bir şey değil açıkçası). Bir anda sentry'den mesaj gelmeye başladı, ne oluyor deyip log kayıtlarını inceleyince önceki gün test için denediğimiz GCP url'lerine istek attığımızı fark ettik (buraya geliştirmeyi direkt test branch'inde yaptığımız için de, dev'den gelen değişiklik bunu ezmedi ve bizler de maalesef bunu fark edememiştik). Hızlı bir şekilde geliştirmeyi tamamladık (en fazla 10dk, fark edip çözüp canlıya alma süresi) ve yeni halini canlıya aldık. Ohh derin bir nefes aldık derken o kadar da derin bir nefes almadığımızı fark ettik. Sahadaki cihazların %80'lik bir kısmının servis dışı olduğunu fark ettik...</span><br /></span></span></p><p><span><span><span><span> Bunun sebebini incelediğimizde herkesin teorik olarak çok iyi bildiği bir servis çökerse diğer servisler ayakta kalmaya devam etmeli prensibi aslında. Nasıl mı? Şöyle ki IoT olan servisimiz başka bir servise istek atıyor, o servisten timeout hatası alıyoruz (çünkü yanlış yere istek (GCP) atıyorduk). Birkaç defa cihazlar bu isteği tamamlayıp istedikleri cevapları da almayınca kendilerini kapatıyorlar. </span></span></span></span> Bu bizim için hayra alamet bir durum değildi maalesef. Çünkü cihazlar kendilerini kapatıp bize komut göndermiyorsa bu onlara uzaktan erişemiyoruz anlamına geliyordu ve galiba cihazlar fiziksel reset istiyordu, bu da Türkiye'nin dört bir yanına dağılmış cihazlar için hiç de kolay bir şey değil...</p><p><span> Tüm bu olumsuzluklardan sonra bir başarı hikayesi arıyorsanız maalesef böyle bir durum yok :( Çok fazla şey denedik ama üstesinden gelemedik, en sonunda bayrağı kaldırıp cihazlara fiziksel erişim için operasyon ekibiyle iletişime geçtik ve onlar da farklı şekillerde bunu hala çözmeye çalışıyor. Şu an cihazların yarısı aktif durumda ve biz hala uğraşıyoruz.</span><br /></p><p><span><span> Peki ben bunca şeyi niye mi yazdım, yaşadığımız bu stresli süreci biraz da olsa anlatmak ve rahatlamak. Ayrıca çok küçük gördüğümüz 2-3 satır log'un bazen de nelere sebep olabileceğini hatırlatmak...</span></span></p><p><span><span><span> </span>Kuzenimin bana anlattığı ufak bir olayı anlatayım. Kendisi diş hekimi ve bir hastanın dişini çekerken çok fazla parametreye baktığını o yüzden bazen bir dişi çekmek için oldukça vakit harcadığını söyledi, sonra da yeni hekimler görüyorum, hemen çat diye dişi çekiyorlar ve hayatlarına devam ediyorlar. Aslında o an çekilen dişin nelere sebep olacaklarını bilseler bu işi bu kadar da hızlı yapamazlardı demişti. O an güzel bir tecrübeyi dinlemiştim ama bunu şimdi daha acı bir şekilde anlıyorum. </span><br /></span></p><p><span><span><span> İşlerin yan etkilerini çok düşün(e)meden </span></span></span>farklı sebeplerden dolayı hızlar işler yapmak durumunda kalıyoruz. Daha sonra da dilimiz yandıkça (tecürbe kazandıkça) o hız yerini olgunluğa bırakıyor. Bu tecrübe bizi her ne kadar frene basmamıza vesile olsa da güvenli şekilde sistemi ilerletmek çoğu zaman çok daha önemli oluyor. Ayrılıklar nasıl sevdaya dahil ise başarısızlıklar da başarıya dahildir diyerekten müsadenizi istiyorum. </p><blockquote><p>(Akıllı ve olgun) Mü'min aynı delikten iki defa sokulmaz, ısırılmaz." [<a href="https://sorularlaislamiyet.com/mumin-ayni-delikten-iki-defa-sokulmaz-isirilmaz-hadisi-ne-demektir-0" target="_blank">Detayı</a>]</p></blockquote><blockquote><p>(Buhârî, Edeb, 83; Müslim, Zühd, 63)</p><div class="separator" style="clear: both; text-align: center;"></div></blockquote><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPq_jS496YaPWwG6tv-N8kxDd762qSeMadKfLOptUdMo3VBteL2CmjclCVDq2sJDNLODvd5uZ-RQezIenJv207KGr2iEkR3ozWeBRoEf4cebU5_gfG8eaKZcGfXXAgc-Nr4-YORE9h2rr33V2FuIn45GNQNcx3ZXNf9x-Bpj15OGXRuugK6Xlz4X48JkXW/s620/free-palestine-quds-vector-illustration-600w-1970687537.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="620" data-original-width="600" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPq_jS496YaPWwG6tv-N8kxDd762qSeMadKfLOptUdMo3VBteL2CmjclCVDq2sJDNLODvd5uZ-RQezIenJv207KGr2iEkR3ozWeBRoEf4cebU5_gfG8eaKZcGfXXAgc-Nr4-YORE9h2rr33V2FuIn45GNQNcx3ZXNf9x-Bpj15OGXRuugK6Xlz4X48JkXW/w620-h640/free-palestine-quds-vector-illustration-600w-1970687537.jpg" width="620" /></a></div>malik masishttp://www.blogger.com/profile/06624991798770591895noreply@blogger.com0tag:blogger.com,1999:blog-894742662176818755.post-80951779450411433912024-03-03T15:03:00.000-08:002024-03-03T15:03:15.731-08:00Ne İçin Çalışıyorum?<p> <span> S.A. Arkadaşlar,</span></p><p><span><span> Gecenin ilerleyen saatlerine doğru ilerliyoruz. Böyle olunca da insan bazı şeyleri sorgulamıyor değil. Bu saatte ne mi yapıyorum, birkaç gün sonra gireceğim sistem dizayn mülakatına hazırlanıyorum (belki siz bu yazıyı okurken çoktan girmişimdir :). Bir yandan Filistin'deki zulüm diğer yandan 3 ayların içinde olmamız, ama benim teknik bir mülakata hazırlanıyor olmam...<span></span></span></span></p><a name='more'></a><span> İnsan dönem dönem durup kendini sorgulamalı. Ben ne yapıyorum, neden yapıyorum, yapınca ne olacak, yapmazsam ne olacak gibi soruların cevabını aramalı. Bunu açıkça söylemek gerekirse zaman zaman yapıyorum, cevabını bulabiliyor muyum bilmiyorum ama zaman zaman düşünüyorum. Bazen de cevaplarım arasında tutarsızlık olmuyor da değil, ama inandığım değerlerin dışına çıkmamaya özen gösteriyorum, en azından bunun için mücadele etmeye çalışıyorum. </span><br /><p></p><p><span><span><span> Uzun süredir yazı yazmaya ara vermiştim, vaktimi daha farklı konulara ayırmanın daha doğru olacağını düşündüm, öyle de yaptım. Zaman zaman bazı yazılar yazsam da bunları Linkedin üzerinden hala gönderi olarak göndermiyorum, onun yerine belirli aralıklarla Filistin'deki olaylara farkındalık oluşturabilmek adına birer gönderi yayınlıyorum. Keza Twitter'dan destek olmaya çalışıyorum. Bu nasıl ve ne kadar farkındalık meydana getiriyor bilmiyorum ama karınca misali tarafımızı ve mücadelemizi ortaya koyuyoruz. </span><br /></span></span></p><p><span><span><span><span> Peki ben bu düşüncemdem vaz mı geçtim derseniz, hayır vazgeçmedim, bir yandan hayat da devam ediyor. Her ne kadar üzülsek de bir şeyler yapmaya çalışsak da (yeterliliği tartışılır, belki de tartışılmaz oldukça yetersizdir) hayat mücadelesi devam etmekte. Aslında bu hayat mücadelesi dışında müslüman güçlü olmalıdır. Hadisi şerifte de belirtildiği gibi "</span></span></span></span>Güçlü mü'min zayıf mü'minden daha üstün ve daha hayırlı ve Allah'a daha sevimlidir". Öyle olmasa belki de biz şuan Filistin'deki zulüme seyirci olmak zorunda kalmayacaktık. O yüzden dünya hayatında da güçlü olabilmeliyiz, ama neden ve kimin için güçlü olacağımızı aklımızdan çıkarmamalıyız. Şüphesiz başka bir hadisi şerifte belirtildiği gibi "Ameller ancak niyetlere göredir".</p><p><span> Şimdi bu teknik mülakata çalıştığımda gecenin bu saatinde ben doğruyu mu yapıyorum diye kendime sorduğumda biraz duraklıyorum ve niyetimi sorguluyorum. Ben bu isteğimi, mücadelemi Allah'ın rızası için mi ortaya koyuyorum yoksa nefsani arzular için mi ortaya koyuyorum. Yani daha iyi bir işim, daha iyi maaşım olsun diye mi yapıyorum (bunların bir insanda olmasında hiçbir beis yok, sadece bu amaç mı araç mı insan kendini sorgulamalı.). Buna cevap vermek yerine herkes kendi nefsine sorsa daha güzel olur herhalde.</span><br /></p><p><span><span> Ümidim ve isteğim Yüce Allah'tan odur ki niyetimin halis olması. Dünya metasını kendi rızası için istiyor olmak ve bunu hiçbir zaman amaç haline getirmemek... Vaizin de söylediği gibi "dünya malı kalpte değil cepte olmalıdır, gerektiğinde çıkarıp verebilmelidir".</span><br /></span></p><p><span><span><span> Çalışmaya ufak bir verip böyle düşünceye dalmış iken bunu yazıya dökmeye çalıştım, öncelik söylediklerim kendi nefsime, belki ufuk dünyanıza da güzel bir şeye vesile olursa ne ala ...</span></span></span></p><p><span><span><span><span> Yaşasın tam bağımsız Filistin...</span></span></span></span></p><p><span><span><span><span> <span> B</span>ağımsız Mescid-i Aksa kubbesi altında görüşmek duasıyla...</span><br /></span></span></span></p><p><span><span><span><span></span></span></span></span></p><blockquote><span><span><span><span>"Ey iman edenler! Sabır ve namazla yardım dileyin. Şüphesiz Allah sabredenlerin yanındadır. </span></span></span></span>Allah yolunda öldürülenler için “ölüler” demeyin. Hayır, onlar diridirler, fakat siz bilemezsiniz. Andolsun ki sizi biraz korku ve açlıkla; mallardan, canlardan ve ürünlerden eksiltmekle sınayacağız. Sabredenleri müjdele! Onlar, başlarına bir musibet geldiğinde, “Doğrusu biz Allah’a aidiz ve kuşkusuz O’na döneceğiz” derler. İşte rablerinin lütufları ve rahmeti bunlar içindir ve işte doğru yola ulaşmış olanlar da bunlardır." Bakara (153-157)</blockquote><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjORIfb6MG_W1A753kgUC_phJbs_j7F0zE0ifBakwKIAukubeNxZRqaQErSEWRGolcnQywItHnkwBiKX3LCoDx6fJ83I6UpJUoTrX3FvrOIBHh3VDhV7X0p2ma8Y-dXJOU9wVMvf8emznfl5-FQ2_wUBb5ez4GFk4-1lAElsqu9BXYcearVjNUWdL5glfwl/s620/free-palestine-quds-vector-illustration-600w-1970687537.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="620" data-original-width="600" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjORIfb6MG_W1A753kgUC_phJbs_j7F0zE0ifBakwKIAukubeNxZRqaQErSEWRGolcnQywItHnkwBiKX3LCoDx6fJ83I6UpJUoTrX3FvrOIBHh3VDhV7X0p2ma8Y-dXJOU9wVMvf8emznfl5-FQ2_wUBb5ez4GFk4-1lAElsqu9BXYcearVjNUWdL5glfwl/w620-h640/free-palestine-quds-vector-illustration-600w-1970687537.jpg" width="620" /></a></div><p></p><p></p>malik masishttp://www.blogger.com/profile/06624991798770591895noreply@blogger.com0tag:blogger.com,1999:blog-894742662176818755.post-43425024875413388072024-02-27T15:50:00.000-08:002024-02-27T15:50:50.861-08:00Nano Ekipler<p> <span> S.A. Arkadaşlar,</span></p><p><span><span> Bugün ekiplerin büyüklükleri ile ilgili bir konu hakkında yazmak istiyorum. Özellikle son yıllarda meşhur olan "squad" kavramı, ekipleri küçültüp daha hızlı yönetebilir, kendi içinde karar alıp hızlıca yoluna devam edebilir, başkasına bağımlı olmasın gibi sloganlarla yola çıktı ve bunu uygulayan birçok da şirket var, ama sanırım çoğu şeyin olduğu gibi bunun da suyunu çıkarmış olabiliriz. Hazırsak başlayalım.<span></span></span></span></p><a name='more'></a><span> Mikroservis uygularken her servisi kodlayan ekip sayısı 2 pizzayla doymalı gibi bir varsayım var. Muhtemelen duymuşsunuzdur. Burada ekiplerin yukarıda da bahsettiğimiz gibi çok büyük olması istenmez. Aslında bu gayet mantıklı. Her ekibin de kendi göbek bağını kendi kesecek yetkinliklerde çalışanları da olmalı tabii ki. Yazılımcı, testçi, analist ve diğer gerekenler artık ne ise (domainden domaine bu değişiklik gösterebilir). Bu dediğim gibi kağıt üzerinde mantıklı gözükmektedir. Peki gerçek hayat uygulamalarında ne gibi sancıları olabilir, aslında iyi yönetilemediğinde ne gibi sancılar olabilir demek daha doğru olacaktır.</span><br /><p></p><p><span><span><span> En iyi çalışanını yönetici yapmak her zaman doğru sonuç vermez. Bunu duymuşsundur belki de yaşamışsınızdır. Çünkü hem kötü bir yönetiniciniz/lideriniz olabilir hem de iyi bir yazılımcıyı da kaybetmiş olabilirsiniz (bu konuda da son dönemlerde farklı şirketlerde duyduğum staff, principle etiketleri altında teknik tarafta kalmak isteyenlere yeni yollar sunulması gayet güzel bir gelişme). Buna benzer olarak da özellikle bu ekipler çok küçük olduğunda ve de ekibe liderlik yapan arkadaşa farklı konularda birçok toplantılar atandığında ekibin verimi düşebiliyor. Nasıl mı?</span></span></span></p><p><span><span><span><span> </span>Şöyle ki, daha önceleri ekipte iyi bir yazılımcı olarak çalışan bir arkadaş, belirli bir süre sonra ekipte liderliğe terfi etti. Hem ekip için hem de kendisi için güzel bir şey gibi duruyor. Çünkü gösterdiği performans kıymet görmüş ve bunun karşılığını almıştır ancak ekip lideri pozisyonuna geçtikten sonra herkesin malumudur ki artık eskisi gibi geliştirmeye zamanını ayıramayacaktır. Farklı toplantılar, belki iş mantığıyla ilgili diğer işler, planlama şu bu derken zamanın yarısını geliştirmeye verse mutlu olacak hale gelecektir. Bunda garipsenecek bir şey yok aslında. Bu işin fıtratında var, burada dikkat edilmesi gereken şey bu ekip eğer küçük bir ekip ise ve iyi bir yazılımcıyı da nispeten geliştirme tarafından çıkardıysanız bunun yerine bir şekilde doldurmanız gerekiyor. Yoksa günün sonunda birçok yarı verimli ekip sahip olma tehlikeniz var. Ekipte takım lideri dışında en azından kendi seviyesine yakın 1 senior developer olmalı yoksa hem ekipe hem de yeni takım liderine çok iş düşmüş olur, günün sonunda maalesef ki verim de bir o kadar düşer. Bu işten pek de kazanan çıkmayabilir...</span></span></span></p><p><span><span><span><span> Konuyu özetlemek gerekirse ekiplerin küçük olması, hızlı hareket etmesi güzel ama bu ekipleri çok küçük parçalara da bölmemek lazım. Yani mikroservislerdeki servisleri böldüğümüzde nasıl ki belirli bir domainde çok küçük parçalara bölmüyorsak (böldüğümüzde çok farklı maliyetler, çok büyük olduğunda da farklı problemler çıkabiliyor) burada da ekipleri küçük(mikro) yapacağız derken küçücük(nano) yapmamaya gayret göstermeliyiz diye düşünüyorum.</span><br /></span></span></span></p><p><span><span><span><span><span> Sizlerin de bu konuda farklı düşünceleri, farklı gözlemleri varsa dinlemek isterim. Buradaki pencereden böyle gözüküyor olabilir ama farklı pencelerden fikirlere her zaman ihtiyaç vardır.</span><br /></span></span></span></span></p><blockquote><p><span><span><span><span><span><span> "</span></span></span></span></span></span>Hep birlikte Allah'ın ipine (kitabına, dinine) sımsıkı sarılın. Parçalanıp ayrılmayın. Allah'ın üzerinizdeki nimetini düşünün. Hani siz birbirinize düşmanlar idiniz de, O, kalplerinizi birleştirmişti. İşte O'nun (bu) nimeti sayesinde kardeşler olmuştunuz. Yine siz, bir ateş çukurunun tam kenarında iken oradan da sizi O kurtarmıştı. İşte Allah size âyetlerini böyle apaçık bildiriyor ki, doğru yola eresiniz." (Âl-i İmrân - 103)</p></blockquote><p><span><span><span><span></span></span></span></span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghMypZO7VwMH_FPSFiEn_s-QOdUZIVwUYhYJO8_aDiPuV6mV-y26XzLQQNs6gWeggxzrUjw0uAgpPhYE4V6RcIdSY-sTjSA8BUaCT0K6t1C5GrWBKViig1uAVAJ-zD8CrG3b0rq6qdAPOe1YEBd0ev9hLdz7pJY19veF4czZtVzur-3SsxhF0Zd5HvyR1_/s620/free-palestine-quds-vector-illustration-600w-1970687537.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="620" data-original-width="600" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghMypZO7VwMH_FPSFiEn_s-QOdUZIVwUYhYJO8_aDiPuV6mV-y26XzLQQNs6gWeggxzrUjw0uAgpPhYE4V6RcIdSY-sTjSA8BUaCT0K6t1C5GrWBKViig1uAVAJ-zD8CrG3b0rq6qdAPOe1YEBd0ev9hLdz7pJY19veF4czZtVzur-3SsxhF0Zd5HvyR1_/w620-h640/free-palestine-quds-vector-illustration-600w-1970687537.jpg" width="620" /></a></div><p></p>malik masishttp://www.blogger.com/profile/06624991798770591895noreply@blogger.com0tag:blogger.com,1999:blog-894742662176818755.post-3619693071945674992024-02-25T13:38:00.000-08:002024-02-28T13:17:15.908-08:00Yine Aynı Film: Sene Sonu Geyikleri<p> <span> S.A. Arkadaşlar,</span></p><p><span><span> Geçen yılı oldukça verimli geçirmeme rağmen son dönemlerde çok kendimi zorlasam da nedense bir türlü bir yazı ortaya çıkmadı. Aslında aklıma birçok konu olmasına rağmen neden böyle olduğunu çözemedim neyse ki şimdi giriş yapabiliyorum, umarım devamı gelir. Bu yazının konusu malum yılbaşı olaylarından sonra (genelde benzer şeyler yaşanır :) şirketinizin size verdiği zam oranı sonrası bir arayış başlar, bu neticelenir genelde, şirket öncesinde ya belirli vaatler bulunmuştur ya da bulunacaktır (bazen zam oranını yükseltir) ama diğer tarafta da gerçekler duruyor. Bugün hassas olabilecek bir konuyu konuşabileceğiz. Hazırsanız buyurun.<span></span></span></span></p><a name='more'></a><span> Konuyu mümkün mertebe şahsımın dışında değerlendirmeye çalışıyor olacağım (Anlatılanlar hayal tamamen hayal ürünü değildir, duyulan yaşanılan gerçek hayattan kesitlerdir). </span><br /><p></p><p><span><span><span> Bir iş yerinede çalışıyorsunuz ve çok da mutlusunuz, şirketle belirli bir seviyede uyumu yakalamışsınız, ekibiniz güzel, toksik olmayan bir ortam var ve orada devam etmeyi istiyorsunuz. Buna karşılık yıl sonu yaklaşıyor, ufak ufak mırıldanmalar başlıyor (hepinizin bildiği klasik döngüler), beklentiler vs derken yine Ocak sonu çatıp geliyor (neden ısrarla son gün son haftaya kadar bekleniyor, inanın onu da anlamış değilim, anlayan birileri varsa dinlemek isterim). Geliyor gelmesine de bombayla birlikte geliyor :) </span><br /></span></span></p><p><span><span><span><span> Zamlar açıklanıyor, beklentinizin çok dışında, nispeten akıllı olanlar (artısı eksisi tartışılır) yeni teklifleri değerlendirmiş ve gitmiş ya da gitmeye çok yakın olanlardır, geriye kalanlar ve eski tecrübelerinden ders almayanlar ise yine aynı döngüyü yaşamaya başlamışlardır. </span><br /></span></span></span></p><p><span><span><span><span><span> Şirkette mırıldanmalar başlayınca ya da başlamadna belirli mevkilerle çalışanı ikna etmeye çalışır, bu mevkinin de gazı bir süre belki devam eder, belki devam etmez tam aksine bir etki de meydana getirebilir. Şirket tabii ki boş durur mu, önce güzel bir acıtasyon ve ardından da sonraki dönemlerde daha iyi zam ve maaşlar vereceğini vaat eder (bu satırları okuyan birçok okuyan insan evet ya aynısı diyor mu yoksa bu benim hayal ürün mü?) ve hiçbir şey olmamış gibi yaparak hayatına devam etmeye çalışır. </span><br /></span></span></span></span></p><p><span><span><span><span><span><span> Aynı şeyi daha önce duyan çalışanlar önce bir sinir hışımla ya sert sözler söyler veya susarak belirli platformlardan özgeçmişler düzenlenerek yeni iş arayışlarına başlanır. 1-2 hafta şirkette doğru düzgün iş yapılmaz, herkes aynı konuları kendi arasında konuşur, konuştukta sinirlenir, sinirlendikçe konuşur. 1-2 hafta geçer herkes ufak ufak temposuna döner, şirket bu halden memnun, çalışanlarını tutabilmiştir ya da tuttuğunu sanmıştır.</span></span></span></span></span></span></p><p><span><span><span><span><span><span><span> Güncellenen özgeçmişlerle birlikte çalışanlardaki zihinsel kopuş çoktan yaşanmıştır, her ne kadar işini yapmaya çalışsa da o artık batan gemiyi terk etmenin peşindedir, belki hızlı belki yavaş ama zihinde kopuş çoktan yaşanmıştır bile. Şirketin çok umrunda olduğunu sanmıyorum çünkü o hale bir şeylerin yolunda olduğunu sanıyor veya öyle olduğuna inanmak istiyor.</span><br /></span></span></span></span></span></span></p><p><span><span><span><span><span><span><span><span> Şubat ortası itibariyle ufak ufak mülakatlar ayarlanır, görüşmeler yapılır, süreçler yavaş ilerliyordur bazen, bazen ise çok hızlı, o döneme, şirkete, kişinin ne kadar hızlı iş değiştimek istemesine ve daha birçok parametreye göre değişikenlik gösteriyor.</span><br /></span></span></span></span></span></span></span></p><p><span><span><span><span><span><span><span><span><span> Mülakatlar olmaya başladıkça zihinsel kopuş hızlanıyor, zaten bir kere o özgeçmiş güncellendi mi maalesef o işi geri dönüşü pek mümkün olmuyor, oluyorsa da bilinçaltındaki o düşünce gitmiyor, çünkü artık kendisi de biliyor ki 6 ay veya 1 yıl sonra yine benzer şeyler olacağını...</span><br /></span></span></span></span></span></span></span></span></p><p><span><span><span><span><span><span><span><span><span><span> Mart başı gibi süreçler olumlu giderse ufak tefek hareketlenmeler olur ve herkes kıvılcımın ilk nereden geleceğini bekliyordur. Zincirin en zayıf halkasının kopması artık an meselesidir. Zincir koptuğunda hiç beklenmediği şekilde dağılış baş gösterir. (İnanın buna birçok kez şahit oldum)</span><br /></span></span></span></span></span></span></span></span></span></p><p><span><span><span><span><span><span><span><span><span><span><span> Şirketler buna karşı reaksyion alamaz mı peki? Çok hızlı bir şekilde kişi bağımsız reaksiyon alan 1 tane firmaya denk geldim ben açıkçası, kişi başlı reaksiyon yapmayı deneyen firmaları daha çok duydum. O çalışanı kaybetmemek için zam oranını yükselten veya kıdem veren veya aman sen gidersen yerine başkasını alırım diyen firmalar da azınlıkta değil. Şahıs bazlı aksiyon alan firmaların çözümü de çok kalıcı olmyuor açıkçası eğer yaptıkları hatalardan ders almazlarsa (hatalarından ders alanları da duydum)</span><br /></span></span></span></span></span></span></span></span></span></span></p><p><span><span><span><span><span><span><span><span><span><span><span><span> Konu biraz duygusal, öyle derler sektörde :) herkesin arkadaş çevresinde konuştuğu ama yüksek sesle dile getirmediği ya da getirmek istemediği, getirenlerin de linçlendiği bir ülke burası :)</span><br /></span></span></span></span></span></span></span></span></span></span></span></p><p><span><span><span><span><span><span><span><span><span><span><span><span><span> Konuyu sonuca bağlayamadım diye düşünüyorum, nasıl bağlayayım ki, her insan/şirket farklı bir dünya, umarım dünyanız güzel olsun, ahiretiniz daha da güzel, vesselam.</span><br /></span></span></span></span></span></span></span></span></span></span></span></span></p><p><span><span><span><span><span><span><span><span><span><span><span><span><span><span> </span></span></span></span></span></span></span></span></span></span></span></span></span></span><em style="background-color: rgba(243, 243, 243, 0.3); box-sizing: inherit; color: rgba(0, 0, 0, 0.84); font-family: medium-content-serif-font, Georgia, Cambria, "times new roman", Times, serif; font-size: 20px; letter-spacing: -0.08px;">"Ey iman edenler, yapmayacağınız şeyi niçin söylüyorsunuz? Yapmayacağınız şeyleri söylemeniz, Allah katında büyük bir gazap nedenidir." (Saf, 61/2-3)</em></p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMy7mBtIE867abQF5LZDqgNj_0_CpVZom5B4ya69mKlvRJtL_J9kpoa_ocYbYDfbUNMHqLLGTE5IPDiGWybLW8hhomyXXGZ1zBTSzbNL8dYbKfTTtFO07XgifjCq_z5pNbD28dwsjK6mtRxVeAXS6_FXOL_IU5UlZFeG9vndZBFoFp9LjNJy3rhhjdg2ki/s620/free-palestine-quds-vector-illustration-600w-1970687537.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="620" data-original-width="600" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMy7mBtIE867abQF5LZDqgNj_0_CpVZom5B4ya69mKlvRJtL_J9kpoa_ocYbYDfbUNMHqLLGTE5IPDiGWybLW8hhomyXXGZ1zBTSzbNL8dYbKfTTtFO07XgifjCq_z5pNbD28dwsjK6mtRxVeAXS6_FXOL_IU5UlZFeG9vndZBFoFp9LjNJy3rhhjdg2ki/w620-h640/free-palestine-quds-vector-illustration-600w-1970687537.jpg" width="620" /></a></div><br /><em style="background-color: rgba(243, 243, 243, 0.3); box-sizing: inherit; color: rgba(0, 0, 0, 0.84); font-family: medium-content-serif-font, Georgia, Cambria, "times new roman", Times, serif; font-size: 20px; letter-spacing: -0.08px;"><br /></em><p></p><p><span><span><span><span><span><span><br /></span></span></span></span></span></span></p><p><span><span><span><span><span><span><br /></span></span></span></span></span></span></p><p><span><span><span><span><span><span><br /></span></span></span></span></span></span></p><p><span><span><span><span><span><span><br /></span></span></span></span></span></span></p>malik masishttp://www.blogger.com/profile/06624991798770591895noreply@blogger.com0tag:blogger.com,1999:blog-894742662176818755.post-82228114812898370252023-11-26T08:24:00.000-08:002023-11-26T12:55:11.073-08:00Çalışanın Kariyeri mi Performansı mı?<p> <span> Selamün Aleyküm Arkadaşlar,</span></p><p><span> Bugün belki de net bir doğru cevabı olmayan bir konuyu ele almayı düşünüyoruz. Bir yazılımcı ya da çalışanın kariyeri/teknik bilgisi mi önemli yoksa o anda çalıştığı şirketteki performansı mı önemli sorusunun cevabı üzerinde tartışıyor olacağız. Hazırsak başlayalı</span>m.<span><span></span></span></p><a name='more'></a><span><span> Yıllar önce çalıştığım bir şirkette takım arkadaşı ihtiyacı olmuştu, ben de iş değiştirmeyi düşünen bir arkadaşımın özgeçmişini insan kaynaklarına ilettim. Özgeçmişe benim yanıma şöyle bir göz attıktan sonra en son çalıştığı şirketi görüp "aa burada çalışıyorsa iyi bir yazılımcıdır" dedi. O zamana kadar büyük şirketlerde çalışmanın önemli veya kariyer açısından iyi olduğunu tahmin ediyor veya sağdan soldan duyuyorduk, fakat kendi gözlerimle böyle bir şeye şahit olmak beni şaşırtmıştı açıkçası. O an, çok iyi yazılımcı olsa da özgeçmişinde büyük/iyi bir şirket yoksa elenmiş de olabilirdi diye düşündüm. Bu da işin bir cilvesi olsa gerek, yani çok da şaşırmamak mı lazım acaba, iyi bir şirkette çalışıyorsa iyi bir yazılımcı olma potansiyeli en azından daha yüksek olabilir miydi acaba? (Şu an olduğum yerde çalışmaya başladıktan sonra, beni işe alan yöneticim bir önceki şirketimin iyi olmasına atıfta bulunmuştu, demek öyle veya bu önemli olabiliyor)</span></span><p></p><p><span><span><span> </span>Yukarıdaki paragrafı yazarken Boğaziçi, ODTÜ gibi kalburüstü üniversitelerden mezun olanlara öncelik veren firmalar aklıma geldi. Bu tarz ilanları ben de gördüm, açık açık yazmaktan da hiç çekinmiyorlar, açıkçası o ilanı görünce de garipsemiştim, böyle düşünsen bile böyle yazmazsın herhalde diyordum kendi kendime... Geçenlerde Gazi mezunu bir arkadaşım, Ankara'da bir firma ile yaptığı iş görüşmesini bahsetti, yan odada ODTÜ'lü bir arkadaş vardı, ona biz zaten ODTÜ'den olan arkadaşlarla çalışmayı daha çok tercih ediyoruz dediğini duyunca mülakatı kafamda o an bitirdim demişti. Bu tarz şeyler efsane gibi sanılsa da gerçekler çok farklı.</span><br /></span></p><p><span><span><span> Eski çalıştığım yerden direktörüm ile muhabbet ederken, bana bir anısını anlatmıştı. Biz Boğaziçi ve Selçuk Üniversitelerinden aynı anda birer arkadaşı işe aldık. Kendisi de itiraf ediyor. Boğaziçili olan arkadaştan beklentimiz çok farklıydı. 2-3 ay sonra Selçuk Üniversitesindeki arkadaş özveriyle çalışıp çok güzel işler yapmaya başladı, ama Boğaziçili olan arkadaş ile yolları ayırmak zorunda kaldık ya da istifa etti demişti. Etiketler önemli olsa da aslında gerçekler bunlardan farklı olabiliyor.</span><br /></span></span></p><p><span><span><span><span> Bu konuyu bana düşündüren/yazdıran şey ise bir çalışanın mülakat veya teknik performansı/bilgisi diğer takım arkadaşından daha iyi, fakat ortaya koyduğu iş aynı arkadaşına oranla daha düşük olabilir. Bunlar gayet olağan şeyler, yani bir insanın iyi olması o takımda uyumlu çalışması anlamına gelmez. Böyle bir durumda neler olur peki? Kıdem olarak daha iyi olan kişi iş olarak daha az iş çıkarıyor. Bu birisi kötü diğeri iyi anlamına gelmez, sadece yöneticisi açısından bunu değerlendirdiğimizde nasıl olur onu düşünmeye çalışıyorum. Evet bu arkadaş hem çalıştığı yerler hem teknik bilgisi itibariyle daha iyi gözüküyor olabilir o yüzden de kıdemi hak ediyor diye mi düşünmeli yoksa evet öyle olabilir ama diğer arkadaşı taşın altına elini daha çok koyuyor ve ortaya koyduğu performans da ölçülebildiği kadar daha iyi, kıdemi buna mı vermeli? </span><br /></span></span></span></p><p><span><span><span><span><span> Ortada bir kıdem olduğu varsayıyoruz, örneğin bir takımdaki liderlik verilecek. Kariyeli arkadaşa verdiğinde diğer arkadaş hayal kırıklığına uğramaz mı, ben çok daha iyi çıktı üretiyorum der mi acaba, ya da tam tersini düşünelim, performanslı çalışan arkadaşa verdiğimizde de kariyerli arkadaş ben teknik olarak da kariyer olarak da daha iyiyim demez mi? Zor şeyler değil mi? Yoksa bana mı öyle geliyor acaba, bu konudaki düşüncelerinizi cidden çok merak ediyorum. Sizler de kendi tecrübelerinizle yorumları zenginleştirirseniz sevinirim.</span></span></span></span></span></p><p></p><blockquote> Onlar: "Ey Muhammed! Senin bizi davet ettiğin şeye karşı kalplerimiz kapalıdır. Kulaklarımızda da bir ağırlık vardır. Seninle bizim aramızda anlaşmamıza engel bir de perde vardır. Sen istediğini yap, çünkü biz yapıyoruz" dediler. (Fussilet Suresi 5. Ayet)</blockquote><p></p><p><span><span><span><span><span><span></span></span></span></span></span></span></p><div class="separator" style="clear: both; text-align: center;"><span><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7A1KYCNxh_t0W41-orODTCF_M6uHkMFVWuXlUXOEqZA8pFxVnWn_h2cj0s6RaNNlWE8OBxpO0t2KylGMXin5KzSUQuVGx3eY5ql4HGVLNnkCxIxutejKVd1xpVNABE6tjZWHJLbNEIFk31_MvRY7klNwBmmxfGvOkbUNFfO1CY8yPBm6yHBAaC44huMBs/s620/free-palestine-quds.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="620" data-original-width="600" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7A1KYCNxh_t0W41-orODTCF_M6uHkMFVWuXlUXOEqZA8pFxVnWn_h2cj0s6RaNNlWE8OBxpO0t2KylGMXin5KzSUQuVGx3eY5ql4HGVLNnkCxIxutejKVd1xpVNABE6tjZWHJLbNEIFk31_MvRY7klNwBmmxfGvOkbUNFfO1CY8yPBm6yHBAaC44huMBs/w620-h640/free-palestine-quds.jpg" width="620" /></a></span></div><span><br /> </span><p></p>malik masishttp://www.blogger.com/profile/06624991798770591895noreply@blogger.com0tag:blogger.com,1999:blog-894742662176818755.post-54662616889365483502023-11-19T08:12:00.000-08:002023-11-19T08:12:50.568-08:00Outsource Çalışmak ve Çalıştırmak<p> <span> S.A. Arkadaşlar,</span></p><p><span><span> Bugün outsource (dış kaynak) olarak hem çalışmanın hem de çalıştırmanın avantaj ve zorluklarından dilimiz döndüğünce bahsetmeye çalışacağız. Tabi bunu birkaç başlık altında ele almak daha doğru olur diye düşünüyorum. Proje teslimi olarak çalışmak, direkt olarak müşterinin projesinde ve yönetiminde çalışmak, outsource projelerde inhouse (şirket içi ya da iç kaynak) olarak çalışmak gibi konuları ele almaya çalışacağız. Hazırsak başlayalım.<span></span></span></span></p><a name='more'></a><span> Outsource çalışmak uzun süredir var olan ve bolca uygulanan bir yöntem. Pandemi sonrası kullanımı da arttı diye düşünüyorum. Dediğim gibi farklı çalışma yöntemleri olmasına rağmen teknik ik gibi şirketlerin çoğalmasıyla direkt bu işten para kazanan birçok şirket de türedi, fakat benim daha çok odaklanmak istediğim nokta her iki tarafın da teknik olanları...</span><br /><p></p><p><span><span><span> Öncelikle outsource olarak çalışan taraftan bahsetmek istiyorum. Burada bir firmanın diğer bir firmadan çalışan kiralaması olarak düşünebiliriz. Firma neden kendi bünyesine eleman almaz da dışarıdan bir firmadan alır. Bunun birçok avantajı olduğu gibi dezavantajları da var. Gerçek hayattan bir örnek vermek gerekirse İngiltere'den bir firma ucuz çalışanı yurtdışından tedarik etme çalışıyor ve birçok Hintli yazılımcı ile çalışıyor, yaşanan birçok problemden dolayı birçok mağduriyet yaşamışlar. Hatalarından ders alıp bu sefer bir Türk firmasıyla anlaşıp oradaki yazılımcılar ile hayatlarına devam ediyorlar. Aylık her çalışan için fatura kesilir, biri gitmiş başka biri gelmiş artık bu İngiliz şirketi için önemli değil, önemli olan işlerinin ilermesi, bu yöntem gayet de güzel işledi. </span></span></span></p><p><span><span><span><span> </span>Bu tarz firmalarda çalışan olmak duruma göre zor veya kolay olabiliyor. Çünkü hem yurtdışındaki firmaya hem de kendi firmana karşı sorumlusun. Bazen hangi tarafı dinleyeceğin ne yapacağın zor olabiliyor. Outsource firmanın elinde başka işler de vardır, sıkıştıklarında diğer projelerdeki elemanlarını bu işte çalışması için zorlayabilir veya onlardan yardım isteyebilir ya da farklı bahanelerle rapor alıp başka tarafa kaydırılabilir. Kolay yanı ise çalışmaya başladığın yeri beğenmiyorsan farklı müşterilerle çalışmak istediğini belirtebiliyorsun, eğer şartlar uygunsa veya nazın geçebilecek bir durumda isen o zaman da seni farklı bir firmaya kaydırabiliyorlar. Sonuç olarak iyi mi kötü mü onu birlikte çalıştığınız firma belirliyor.</span></span></span></p><p><span><span><span><span><span> Çalışan kiralamaktan öte, direkt olarak projeyi outsoruce veren firmalar da var. Anahtar teslim dediğimiz işler. Bunun bakımı ve sonraki durumlar geliştirmesine göre ikiye de ayrılabiliyor. Eğer firmanın bir yazılım kısmı var ve sonraki bakımı üstlenebilecekse firma belirli bir süre sonra projeyi içeri alabilir veya işinizi iyi niyetle yapmaya devam ederseniz bu süreç güzel bir şekilde devam edebiliyor. Firmanın bunu göğsleyecek bilgi birikimi ya da yeterli kaynağı yoksa bu firmayla daha uzun süreli çalışmak durumunda kalıyor. Burada ise farklı problemler ortaya çıkabiliyor. Şirketin birimlerinin belirli istekleri oluyor ve bu isteklerin karşılanması ve hayata devam edilmesi çok kolay olmuyor. Devam etse de kangrem bir ilişkiye dönüyor maalesef. Birbirine muhtaç ve birbirinden nefret eden muhataplar... Aynı şirkette bile birimlerin IT'ye karşı olan önyargılarını göz önünde bulundurursanız başka bir firma ile olan problemi siz düşünün (çok mu karamsar oldum acaba diye de düşünmeden edemiyorum ama sanki gerçekler böyle gibi)</span></span></span></span></span></p><p><span><span><span><span><span> Şimdi de yukarıda bahsettiğimiz işi veren şirketlerde çalıştığımızı varsayalım. Yani outsoruce edilmiş ekiplerle birlikte çalışıyorsunuz. Eğer şirketiniz fatura bazlı çalışma arkadaşı aldıysa ilişkiler kısmen daha iyi olabilir (Her ne kadar aynı işi yapıyor olsanız da birlikte çalıştığınız arkadaş hem yan haklar hem diğer şartlar gereği sizden daha düşük şartlar çalışıyor olabilir, aman beni ne ilgilendirir demeyin, o kişi siz de olabilirsiniz, bu bazen huzursuzluklar oluşturabiliyor, bu da gerçek hayat örneği...). Çünkü belirli bir süre normal yanınızda çalışan arkadaşınızdan bir farkı kalmıyor, çoğu zaman da şirketi farklı ama aynı işleri yapan takım oluyorsunuz.</span></span><br /></span></span></span></p><p><span><span><span><span><span><span> Diğer durumda ise projeyi outsource vermişsinizdir ve şirketiniz kendi tarafından birilerini her daim sürecin içinde bulundurmak istiyor. Bunun birçok sebebi olabilir. İşlerin nasıl ilerlediğini bilmek, içerideki kod kalitesinin durumu, süreçleri takip etmek ve olur da projeyi içeri almaya karar verirlerse bunu bilen birilerinin olması şirketin elini güçlendiriyor. Bu durumda ne outsource firmaya ne de kendi yöneticilerinize yaranamama gibi bir durum olabilir. Arada pinpon topuna dönme ihtimaliniz olabilir. Özellikle de işler kötüleşmeye başladı mı, outsource firma için zaten kendi takımından değilsinidir, kendi tarafınız için de onları savunuyor olan biri olarak lanse edilebilirsiniz. Bir yukarıdaki duruma göre nispeten daha zorlu bir durum olabilir.</span><br /></span></span></span></span></span></p><p><span><span><span><span><span><span><span> Outsource çalışmak ve outsource olan firmayla birlikte çalışan olmak üzere 4 durumu ele almaya çalıştık. Bunun piyasada çok farklı durumları daha olabilir. Sizler de gerçek hayat örnekleriyle yorumları zenginleştirirseniz okumaktan keyif alırız.</span><br /></span></span></span></span></span></span></p><p><span><span><span><span><span></span></span></span></span></span></p><blockquote><span><span><span><span><span> "</span></span></span></span></span>Arada bocalayıp duruyorlar; ne onlara, ne bunlara! Allah’ın şaşırttığı kimseye asla bir yol bulamazsın." (Nisa, 143)</blockquote><p> </p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqy5ilGeR9PJQYpHUf1lSrvIIyqaCrBFsKOTOO380nRGMd2oDHnHGQH7JQV5GVudPWdyhw0yK5bDmC4q2E29NI_HRfwe3_mZqf5_grAlWbcsC1QPjquGL19KCVD-okcqCPyZNuvuhP5VZl6hCchupoGy5j-96PMQbx2rQsl6ggfP4W6a7fQcizM0JCEzGz/s620/free-palestine-quds-vector-illustration-600w-1970687537.webp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="620" data-original-width="600" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqy5ilGeR9PJQYpHUf1lSrvIIyqaCrBFsKOTOO380nRGMd2oDHnHGQH7JQV5GVudPWdyhw0yK5bDmC4q2E29NI_HRfwe3_mZqf5_grAlWbcsC1QPjquGL19KCVD-okcqCPyZNuvuhP5VZl6hCchupoGy5j-96PMQbx2rQsl6ggfP4W6a7fQcizM0JCEzGz/w620-h640/free-palestine-quds-vector-illustration-600w-1970687537.webp" width="620" /></a></div><p></p><p></p>malik masishttp://www.blogger.com/profile/06624991798770591895noreply@blogger.com0tag:blogger.com,1999:blog-894742662176818755.post-87645675757616002772023-11-19T04:18:00.000-08:002023-11-19T08:22:37.107-08:00Legacy ve Modern Projelerde Çalışmak<p><span> S.A. Arkadaşlar,</span></p><p><span> Birçoklarımızın yaka silktiği ve bu yüzden de iş aramaya başladığı legacy kodlarda çalışmak ile herkesin kovaladığı ve çalışmak istediği modern yapılı (kimine göre mikroservis, kimine göre modüler veya en azından güncel teknoloji ile yazılmış) projelerde çalışmaktan bahsedeceğiz. Belki çok inanmak istemeseniz de iki projede de çalışmanın avantajları olduğunu düşünüyorum. Hazırsak başlayalım.<span></span></span></p><a name='more'></a> <span> Örneklerim genelde dotnet dünyasından olsa da bu diğer diller için de muhtemelen geçerli olacaktır. O yüzden bazen dotnet framework (genelde legacy adıyla da bahsedebiliriz, her zaman böyle olacak diye bir şey yok), dotnet core (bu da dotnet 5 ile birlikte "core" ifadesinden kurtuldu ama karışıklık olmaması için hala kullanıyoruz) olarak da bahsedersek farklı şeylerden bahsetmediğimizi belirtmek isteriz.</span><p></p><p><span><span> Legacy kodlar içeren projelerden başlayalım. Buralarda çalışmanın birçok zorluğu olduğunu herhalde anlatmaya gerek yok. Uzun uzun sınıflar, birbirine bağımlı yapılar, copy-paste yapılan kodlar, manual deployment işleri, test ve dokümantasyondan zaten bahsetmiyorum bile. </span><br /></span></p><p><span><span><span> Projenin daha geliştirme aşamasından legacy düşme ihtimali varsa da (teknik borçlar birikmesi, iş kurallarının çok hızlı değişmesi, proje süresinin uzamas vs vs) genelde yıllardır canlıda olan ve bir yerine dokunulmaya korkulan yerler oluyor. Çalışıyorsa dokunma mantığı ile de çalıştığı için oraya dokunacak bir cengaver de genelde çıkmıyor, çıkanı da sistem törpülüyor. Bir yerden sonra neme lazım, ben de bir if koyar geçerim işine dönüyor maalesef.</span><br /></span></span></p><p><span><span><span><span> Legacy projeler konusunda muhtemelen herkes çok dertlidir, o yüzden yazdıkça insanın aklına farklı tecrübeleri, okudukları ve duydukları geliyor. O yüzden bu olumsuz havaya bir virgül koyup tekrar konumuza dönelim. </span><br /></span></span></span></p><p><span><span><span><span><span> </span></span></span></span></span>Bu projelerin birçoğunun canlıda olduğunu söylemiştik. Buralara yeni özellikler koymak mümkün olmakla birlikte var olan sistemlerin çalışması ve hataların giderilmesi üzerine daha çok emek sarf ediliyor. Özellikle sürekli karşılaşılmayan (repro edilmeyen) hataları çözmek çok daha zor oluyor. Bunun için projeye iyi derecede hakim olmak gerekiyor, potansiyel hata çıkabilecek noktayı iyi tespit etmek gerekiyor, belki log yapısını geliştirmek gerekiyor. Tüm bunları olumsuzluk gibi görsek de ben kendi adıma bu tarz zorlu hatalarla uğraşmayı seviyorum, özellikle çözüldü mü de tadından yenilmiyor. Çünkü bu tarz hatalar bazen günlerce yazdığımız kodlardan daha fazla bizi geliştirebiliyor. Başka güzel bir tarafı da bir sistemin nasıl kodlanmaması gerektiğini de bize göstermiş oluyor. Özellikle yeni projelerde çalıştığımızda o projelerdeki sancıları gördükçe daha özenli işler yapmaya gayret ediyoruz, etmeliyiz.</p><p><span> Modern projelerde çalışmanın birçok avantajı var, zaten bunları eminim herkes az çok biliyordur. Daha temiz kod yazma, şirkete göre değişse de testini ve dokümantasyonunu yazma (açık söyleyeyim bunu yapan az firma gördüm, projenin en başında bile çok acele işler vardır, o yüzden her 3-4 yılda bir projeyi yeniden yazarlar, neyse olumlu yerde olumsuz şeyler yazmayalım:), gerektiğinde arkadaşınla birlikte çalışma (pair), kod incelemeleri (code review), otomatik geçiş süreçleri (CI/CD) gibi bir sürü güzel nokta var. Genelde de projeyi kodlamak eğlenceli olur (sonlara doğru iyi planlama yapılmazsa yine stresli geçer o ayrı bir konu). Bu projelerde hep böyle olumlu şeylerden bahsetsek bile, birçok projede bir yerden sonra benzer işler yapılmaya başlanır (CRUD), ayrıca yaptığınız işlerin görünürlüğü daha düşüktür. Yani o ürün canlıya çıkmadığı sürece her an vazgeçilme ihtimali vardır, bu da insanı hayalkırıklığına iten bir sürece dönüşebilir.</span><br /></p><p><span><span> Kısaca legacy ve modern projelerde çalışmanın zorlu ve güzel taraflarından bahsetmeye çalıştık. Genelde legacy projelerde çalışılmak istenmese de (hak veriyorum) belli dönemlerde çalışmanın da faydalı olabileceğini düşünüyorum (ihalenin size kalmamasına dikkat edin :). Hiçbir şeyin tamamen siyah ve beyaz olmadığına inanan biri olarak, çalıştığımız işlerden keyif almak dileğiyle.</span><br /></span></p><p><span><span><span> </span></span></span>Abdullah b. Mes‘ûd (ra)’dan nakledildiğine göre: Resûlullah sallallahu aleyhi ve sellem’e bir adam geldi ve: “Ey Allahın Resûlü, bir topluluğu seven fakat onların işlediği amelleri işleyemeyen bir insan hakkında ne buyurursunuz?” dedi. Hz. Peygamber (sav) de ona şöyle cevap verdi: </p><p></p><blockquote><b>“Kişi, sevdiği ile beraberdir”</b>. (Buhârî, Edeb 96; Müslim, Birr 165.)</blockquote><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAPBy4ukmNHZLHsCZycggdPqMpHNo3rCGZbQ_5SdlsrunE-jXifHKN76yp-LmUCCv42gBsctqvU7orQ9HIykstinhtwg5m8LaQWK-kuFd2ctmdrvgPyNxYlT-fSfhQ4UbaqAWcVG7wQ1gFoGtzbrFlTr7FXaq7xDoMAx7-EIEsnYqE6BeS36LNz4VzaTL7/s620/free-palestine-quds-vector-illustration-600w-1970687537.webp" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="620" data-original-width="600" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAPBy4ukmNHZLHsCZycggdPqMpHNo3rCGZbQ_5SdlsrunE-jXifHKN76yp-LmUCCv42gBsctqvU7orQ9HIykstinhtwg5m8LaQWK-kuFd2ctmdrvgPyNxYlT-fSfhQ4UbaqAWcVG7wQ1gFoGtzbrFlTr7FXaq7xDoMAx7-EIEsnYqE6BeS36LNz4VzaTL7/w620-h640/free-palestine-quds-vector-illustration-600w-1970687537.webp" width="620" /></a></div>malik masishttp://www.blogger.com/profile/06624991798770591895noreply@blogger.com0tag:blogger.com,1999:blog-894742662176818755.post-91180990623243544762023-11-06T11:18:00.006-08:002023-11-26T06:45:00.473-08:00Document(ion) Driven Development <p> <span> S.A. Arkadaşlar,</span></p><p><span><span> Bugün biraz cahilliğime güleceğim, ayrıca birlikte düşüneceğimiz bir konu üzerine yazmayı düşünüyorum. Geçenlerde şirkette bir geliştirme yapacaktık, bu geliştirmeyi yapmadan önce yazılım mimarımız ile konuştuk (Gökhan abi) ve genel başlıkları kabaca çıkardık, bunu dokümante ettik. Daha sonra bu projeyi kullanacak diğer ekiplere sunduk, onların da fikirlerini alarak dokümantasyonu güncelledik. Son halinde hemfikir olduktan sonra da kodlamaya başladık. Buraya kadar her şey iyiydi, taa ki bu yazıya başlayınca kadar :) TDD'nin temel prensibi önce testi yazıp sonra kodunu yazmak üzerine nasıl kurulu ise biz de önce dokümantasyonu hazırladık sonra kodunu yazdık, buna da "Document Driven Development" (bazı yerlerde Document DD olarak da geçiyor) diyebiliriz diye kendi kendime düşünüyordum, ama böyle bir şey var mı diye başlığı arattığımda maalesef cehaletim yüzüme gün gibi çarptı. Böyle bir şey düşünebildiğime mi sevineyim yoksa bunu hiç duymamış olmama mı üzüleyim, açıkçası bilemedim. Hazırsak başlayalım.<span></span></span></span></p><a name='more'></a><span><span> Yukarıda da bahsettiğimiz gibi projelerimizde ortak bir yapıya ihtiyacımız oldu, bunun isterlerini netleştirmeye çalıştık, diğer ekiplerle birlikte bu konu üzerine hemfikir olduktan sonra kodlamaya başladık. Bunu bize nasıl bir faydası oldu derseniz, öncelikle yapılan işi hemen kodlamak yerine (bayıldığımız ilke olan "kervan yolda düzülür" hatasına düşmedik) ekiple birlikte tüm isterleri toplamaya çalıştık, tabii ki kaçırdığımız noktalar olabilir veya daha sonra buna ek geliştirmeler yapabiliriz, ama ilk en azından ilk aşamada hangi ekibin tam olarak neye ihtiyacı olduğunu anladık ve bu vesileyle over-engineering (gereğinden fazlası düşünmek/tasarlamak) olmadan bu işi sadece ihtiyacımız kadar olan kısmı yaptık.</span></span><div><br /></div><div><span> Biz bu geliştirmeyi yapmadan dokümantasyonumuzu hazırladığımızı söylemiştik, ekip liderlerinin gözden geçirmesine sunduk, burada ekiplerden bir arkadaş daha önce kişisel olarak daha önceden bizim ilgilendiğimiz konuyla ilgilenmiş, bu dokümantasyonu tüm takıma sunsak belki buradaki bilgiyi daha önceden elde edebilirdik, burada böyle bir eksikliğimiz oldu ama tüm ekiple bunu tartışmak da bazen bizleri yavaşlatabiliyor. Bunları ekibin yapısına göre değerlendirmek daha doğru olacaktır.</span></div><div><br /></div><div><span> Yukarıda bahsettiğimiz proje çok daha kapsamlıydı ve bunu değiştirelim mi diye aramızda tekrardan konuştuk, fakat yukarıda da bahsettiğimiz gibi buna gerçekten ihtiyacımız var mıydı? İhtiyacımız olmayan şeylerin çoğunu düşünmeye şu aşamada içeri almaya gerek var mıydı? Biz yok olarak düşünüp yolumuza bu şekilde devam etme kararı aldık.</span></div><div><br /></div><div><span> Hem projenin tasarımı üzerine ekiple bu konuyu tartışmak hem de ihtiyaçları doğru şekilde anlamak açısından benim çok hoşuma giden bir yöntem oldu. Projenin kodlamasını bitirdiğimde kimseden ama bu da olacaktı şu da olmalıydı ya da bize neden haber vermedin şöyle bir isteğimiz de olacaktı gibi sorunların önüne geçmiş olduk. Ayrıca yorumları bir hafta boyunca bekledik herkes müsait zamanında yorumunu ekledi ve son kararı toplanarak verdik. Bunu da aslında çayın demlenmesine benzetiyorum. Yeterince süre beklediğimizde çay nasıl güzelleşiyorsa bu fikir de öyle güzelleşti, tabii çok bekleyip de çayı da yakmamak lazım :)</span></div><div><br /></div><div><span> Bu tarz bir geliştirmenin şöyle bir güzelliği de var, bu işi dokümantasyonuyla birlikte yaptığın için tekrardan buna üşenmeye şansın da olmuyor veya acil bastıran başka işlerden dolayı aman sonra yazalım konusu da ortaya çıkmıyor. Neden dokümantasyon/test yazmıyorsunuz sorularının cevabını eminim hepiniz çok iyi biliyorsunuzdur :)</span></div><div><br /></div><div><span> Her güzel işte olduğu gibi bunun da zorlukları tabii ki var. Dokümantasyon yazmayı veya geri dönüşlerde bulunmayı sevmeyen bir ekipte yer alıyorsanız bu tarz işleri yapmak gerçekten zor olabilir. Neyse ki bizim ekip bu konuda gerçekten iyi ve bu sizi yaptığınız işten daha çok keyif almanıza vesile oluyor.</span></div><div><br /></div><div><span> "Hafız olmak kolay, hafız kalmak zordur" derler, dokümantasyon yazmada da aslında bu şöyle geçerli. Dokümantasyonu yazmak kolay ama güncel tutmak zor olandır. Bu projeye eklemeler yapılmadan önce yine gidip ilgili dokümantasyon güncellenir mi yoksa o andaki aciliyete göre kod hemen yazılıp hayata devam mı edilir.</span></div><div><br /></div><div><span> Bu kullanımda kendimizce gördüğümüz artı eksi yönleri ele almaya çalıştık, benim gibi yazmayı ve geri dönüş (feedback) almayı seven biri için çok değerli ve bir o kadar eğlenceli bir tecrübe oldu. Bunu mümkün mertebe ekipçe kullanmaya özen göstereceğiz.</span></div><div><br /></div><div><span> Yazıyı kuran-ı kerim'in en uzun ayeti olan Bakara 282'nin yazmanın önemiyle ilgili olan kısmıyla bitirelim.</span></div><div><br class="Apple-interchange-newline" /><span style="background-color: #fefefe; color: #003366; font-family: "EB Garamond"; font-size: 16px;"><blockquote>"Ey iman edenler! Belli bir vade ile karşılıklı borç alışverişinde bulunduğunuz vakit onu yazın. Hem aranızda doğruluğuyla tanınmış yazı bilen biri yazsın. Yazı bilen biri, Allah'ın, kendisine öğrettiği gibi yazmaktan kaçınmasın da yazsın. Bir de hak kendi üzerinde olan adam söyleyip yazdırsın ve her biri yazarken Rabbi olan Allah'tan korksun da haktan birşey eksiltmesin. Şayet borçlu bir bunak veya küçük bir çocuk veya söyleyip yazdıramayacak durumda biri ise velisi doğrusunu söyleyip yazdırsın."</blockquote><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgngOnbScr9D2fRJ9M6aX37UN3c0_bR3SQphwsNti089nHt8qOP3hCUrG5z7wNNcfnGkfLDVNWOJdZsN9tnXSafuesgEvL1EOBxDvWz90CksS6uzeuuLg12-y_cWa7VsU9DZqCMhi60Wxfc2trQsSH7dZDKQwF5PXbbeVAKsZ-ZcjLJpsm8X_IMuCdxCXjs/s620/free-palestine-quds.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="620" data-original-width="600" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgngOnbScr9D2fRJ9M6aX37UN3c0_bR3SQphwsNti089nHt8qOP3hCUrG5z7wNNcfnGkfLDVNWOJdZsN9tnXSafuesgEvL1EOBxDvWz90CksS6uzeuuLg12-y_cWa7VsU9DZqCMhi60Wxfc2trQsSH7dZDKQwF5PXbbeVAKsZ-ZcjLJpsm8X_IMuCdxCXjs/w620-h640/free-palestine-quds.jpg" width="620" /></a></div></span></div>malik masishttp://www.blogger.com/profile/06624991798770591895noreply@blogger.com0tag:blogger.com,1999:blog-894742662176818755.post-17754694967368907722023-11-05T09:35:00.003-08:002024-02-25T11:53:34.881-08:00İngilizce Kısaltmalar<p> <span> S.A. Arkadaşlar,<br /><span> Bugün iş hayatımızda kullandığımız bazı ingilizce kısaltmaları paylaşmak istiyorum. Hem çalıştığım ekiplerden hem kod incelemelerinden (code-review) hem de internette denk geldiklerimi derlemiştim. Uzun süredir not defterimde duruyordu, onları da düzenleyerek bir yazı haline getirmek istedim. Umarım işinize yarar. Hazırsak başlayalım.<span></span></span></span></p><a name='more'></a><p></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"></p><ul style="text-align: left;"><li><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">IMHO - in my humble opinion - benim naçizane fikrime göre - bence (Kod incelemelerinde bazı tavsiyelerde veya fikir beyan edilirken sıkça kullanılır)
</span></li><li><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">LGTM - looks good to me - bence iyi görünüyor (Yine kod incelemerinde kullanıyoruz. Kod incelemesinde herhangi bir sıkıntı görülmediyse sıkça kullanılır)
</span></li><li><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">BTW - by the way - Bu arada
</span></li><li><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">OFC of course - Tabii ki (Hiç unutma İngiltere'deki takım arkadaşıma bir keresinde bu kısaltmayı yazdığımda anlamamıştı, çok şaşırmıştım :) )
</span></li><li><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">FYI - for your information - Bilginize (Genel mail veya grup içi konuşmalarda birine haber bilgi/haber vermek için kullanılır)
</span></li><li><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">TY - thank you - Teşekkürler
</span></li><li><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">YW - you're welcome - Rica ederim.
</span></li><li><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">TBC - to be confirmed - Onaylanacak (Net olmayan isterlerde kullanılır, daha sonra kesinleştireceğiz manasında kullanılır.)
</span></li><li><span style="white-space: pre;">TBC - to be decided - Karar verilecek (Net olmayan bir konuda verilecek karar hakkında kullanılır.)
</span></li><li><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">e.g. for example - Örneğin
</span></li><li><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">POC - proof of concept - (Yapılan büyük işin öncelikle ufak bir sunumu veya çalışması için kullanılır)
</span></li><li><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">RN - right now - Hemen şimdi
</span></li><li><span face="Roboto, sans-serif" style="font-size: 16px; white-space-collapse: preserve;">ETD - ETA - estimated time of departure/arrivial - tahmini varış süresi
</span></li><li><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">OMG - oh my God - Aman Allah'ım (Genelde filmlerde geçen şaşırma ifadesi)
</span></li><li><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">BRB - be return back - hemen dönüyorum (toplantılarda birkaç dakikalığına gidip gelmeniz gereken durumlarda kullanılabilir)
</span></li><li><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">ELMO - enough, let's move on. - yeter, sonra devam edelim (Daily gibi toplantılarda bir konunun uzaması üzerine, bu toplantı için fazla ayrıntıya giriyoruz, bunu geçelim manasında kullanılır)
</span></li><li><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">WDYT - what do you think? - Ne düşünüyorsun (Genelde kod incelemelerinde veya grup konuşmalarında birinin fikrini almak için kullanılır.)
</span></li><li><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">AFK -> away from keyboard - Bilgisayar başında değil. (Yine kısa süreliğine bilgisayar başında olmadığı durumlarda kullanılır.)
</span></li><li><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">AFAIK -> As far as I know - Bildiğim kadarıyla
</span></li><li><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">AKA -> also known as - Olarak da bilinir.</span></li></ul><ul style="text-align: left;"><li><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Ayrıca <a href="https://kb.iu.edu/d/adkc" target="_blank">şurada</a> da birçok örnek var. Ben daha çok mümkün mertebe yazılımı ilgilendiren kavramları almaya çalıştım, ama meraklılar buraya da bir göz atabilirler.</span></li></ul><p></p><p><span> <span> Yazıyı kolaylaştırmak ile ilgili bir hadis-i şerif ile bitirelim.</span></span></p><p></p><blockquote>"Kolaylaştırınız! Zorlaştırmayınız! Müjdeleyiniz, nefret ettirmeyiniz! Birbirinizle anlaşın, iyi geçinin, ihtilâfa düşmeyin!" (Buharî, 3:72)</blockquote><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRfDDZoNiJzGdiKTm2-njHghab_xyKEK7lh4baVbQgbumcGQBO2HamFywKdPfL3fuaHinMnARm7K63gMCOWJYtEZydRGn6NUwqI8htKjWw037bERa594AHqJKLWZdiELCAJ0IVaOozqCyeKk7yMzxlsj_4GfLmSlwGIkdABCfek03GctQwGbkCe8-euPnp/s620/free-palestine-quds.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="620" data-original-width="600" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRfDDZoNiJzGdiKTm2-njHghab_xyKEK7lh4baVbQgbumcGQBO2HamFywKdPfL3fuaHinMnARm7K63gMCOWJYtEZydRGn6NUwqI8htKjWw037bERa594AHqJKLWZdiELCAJ0IVaOozqCyeKk7yMzxlsj_4GfLmSlwGIkdABCfek03GctQwGbkCe8-euPnp/w620-h640/free-palestine-quds.jpg" width="620" /></a></div><p></p>malik masishttp://www.blogger.com/profile/06624991798770591895noreply@blogger.com0tag:blogger.com,1999:blog-894742662176818755.post-17745185169470664472023-11-05T09:13:00.000-08:002024-02-25T11:53:20.767-08:00Okuduğum Yazarlardan Notlar 4 - Farklı İçeriklar Üzerine<p> <span> S.A. Arkadaşlar,</span></p><p><span><span> Okuduğum yazarlardan notlar serisine devam ediyoruz, fakat bugünkü yazımız belirli bir yazardan değil, farklı zamanlarda aldığım notlardan oluşmaktadır. Hangi not hangi yazar veya siteden aldığımı hatırlamıyordum, bunları bu şekilde yayımlamak içime sinmedi, ufak bir araştırmayla nerelerden aldığımı yanlarına ekledim, buna rağmen maalesef 2 tanesini bulamadım. Varsa sahibi yorum olarak yazabilir, düzeltirim. Hazırsak başlayalım.<span></span></span></span></p><a name='more'></a><p></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"></p><ul style="text-align: left;"><li><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Dolayısıyla henüz öğrenmedikleri bir işi yönetmeye çalışıyorlardır. </span>Yani, tabii olarak gördüklerini uyguluyorlar. Örneğin, projelerdeki en temel problem çözme yöntemleri, fazla mesaidir. Çünkü onlar da fazla mesai ile projeleri kurtarmaya çalıştılar. (<a href="https://www.javaturk.org/nitelikli-eleman-acigi-mi-niteliksiz-yonetici-fazlasi-mi/" style="font-size: 12pt; white-space: pre;" target="_blank">Akın Kaldıroğlu</a><span style="font-size: 12pt; white-space: pre;">)
</span></li></ul><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"></p><ul style="text-align: left;"><li><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"> Başkaları için bir iletişim / eğlence / bilgi teknolojisi aracı olan cep telefonları bile </span>bizim için “masaya koydun mu ben buradayım” şeklinde bir statü sembolü haline gelebiliyor. (<a href="https://medium.com/@CTasdemir/sorunumuz-nitelikli-eleman-a%C3%A7%C4%B1%C4%9F%C4%B1-m%C4%B1-9f8ba33ebcf6" style="font-size: 12pt; white-space: pre;" target="_blank">Coşkun Taşdemir</a><span style="font-size: 12pt; white-space: pre;">)</span></li><li><span face="Roboto, sans-serif" style="font-size: 12pt; white-space-collapse: preserve;">“30’una gelip hala bir yerlerde “müdür” olamadıysan </span><span face="Roboto, sans-serif" style="font-size: 12pt; white-space-collapse: preserve;">(ben de bu kategorideyim şu an belli ki sende bir sıkıntı var”.</span> (<a href="https://medium.com/@CTasdemir/sorunumuz-nitelikli-eleman-a%C3%A7%C4%B1%C4%9F%C4%B1-m%C4%B1-9f8ba33ebcf6" style="font-family: Roboto, sans-serif; font-size: 16px; white-space-collapse: preserve;" target="_blank">Coşkun Taşdemir</a><span face="Roboto, sans-serif" style="font-size: 16px; white-space-collapse: preserve;">)</span></li></ul><p></p><ul style="text-align: left;"><li><span face="Roboto, sans-serif" style="font-size: 12pt; white-space-collapse: preserve;">UML özellikle de class ve interaction diyagramlarına bakmanızı öneririm.(<a href="https://www.javaturk.org/tasarim-kaliplari-ii-nasil-ogrenelim/" target="_blank">Akın Kaldıroğlu</a>)</span></li></ul><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"></p><ul style="text-align: left;"><li><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Yazılımda iki farklı yapı birbirine benziyorsa bu bir hatadır ve bu iki yapı, </span>tek bir yapı altında birleştirilmelidir. (<a href="https://www.javaturk.org/yazilimi-gelistirmek-mi-gelistirmemek-mi-iste-butun-mesele-bu/" style="font-size: 12pt; white-space: pre;" target="_blank">Akın Kaldıroğlu</a><span style="font-size: 12pt; white-space: pre;">)
</span></li><li><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Verimli çalışma ortamı için takım arkadaşlarının uyumu yeteneklerinden </span>daha öndedir. Uyum sağlayabileceğiniz insanları aramalısınız. (<a href="https://medium.com/@hserdarb/bir-ba%C5%9Fka-yaz%C4%B1l%C4%B1m-geli%C5%9Ftiricilere-%C3%B6%C4%9F%C3%BCtler-yaz%C4%B1s%C4%B1-4c3d72eb6537" style="font-size: 12pt; white-space: pre;" target="_blank">Serdar</a><span style="font-size: 12pt; white-space: pre;">)</span></li></ul><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"></p><ul style="text-align: left;"><li><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Bu yüzden, sadece yazdığımız bütün kelimelerin de geçtiği sayfaların</span> gelmesini istiyorsak arama kelimelerimizin arasına + işareti koyabiliriz. (<a href="http://www.ademkalin.com/2015/01/04/yazilimcinin-arastirma-yontemleri/" style="font-size: 12pt; white-space: pre;" target="_blank">Adem Kalın</a><span style="font-size: 12pt; white-space: pre;">)
</span></li></ul><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"></p><ul style="text-align: left;"><li><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Birçoğumuz program çalıştıktan sonra işimizin bittiğini düşünüyor. </span>Organizasyon ya da temizlik kaygısı duymuyoruz. Geriye dönüp aşırı doldurulmuş sınıfları tek sorumlulukları olan ayrı birimler haline getirmek yerine bir sonraki soruna geçiyoruz.</li><li><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">DIP özünde, sınıflarımızın somut ayrıntılar yerine soyutlamalara bağlı</span> olması gerektiğini söyler. (<a href="https://busrademirci.medium.com/clean-codedan-notlar-bolum-10-siniflar-476f6eac25a3" style="font-size: 12pt; white-space: pre;" target="_blank">Büşra Demirci)</a></li></ul><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"></p><ul style="text-align: left;"><li><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Utangaç kodlar yaz, modülün alakasız hiçbir şeyi diğer modüllere açmasın. (<a href="https://ibrahim-kurce.medium.com/pragmatik-programc%C4%B1-5-3265c321ff68" target="_blank">İbrahim Kürce</a>)</span></li></ul><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"></p><ul style="text-align: left;"><li><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Eğer gerçekten veritabanınızı projenizden soyutlamışsanız, </span>ki burada kısaca PAAS(persistence as a servise) sistemine işaret ediyoruz, nehrin ortasında at değiştirecek kadar esnekliğe sahipsiniz demektir. (Referansı bulunamadı)</li></ul><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"></p><ul style="text-align: left;"><li><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Kayalar içine oyulmuş kararlar yerine, </span>onları kumsaldaki kuma yazılmış kararlar olarak görmemiz gerekiyor. Büyük bir dalga gelebilir ve bütün kararları silip süpürebilir. (Referansı bulunamadı)</li></ul><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"></p><ul style="text-align: left;"><li><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Ne kadar yaklaştığınızı anlamak için tahminlerinizi kaydetmek iyi bir fikir olabilir. </span>Tahminleriniz yanlış çıkınca, hemen omuz silkip uzaklaşmayın. Kendi varsayımınızdan neden farklı olduğunu öğrenmeye çalışın. (<a href="https://ibrahim-kurce.medium.com/pragmatik-programc%C4%B1-9-fdaa6317b5bf" style="font-size: 12pt; white-space: pre;" target="_blank">İbrahim Kürce</a><span style="font-size: 12pt; white-space: pre;">)
</span></li><li><span face="Roboto,sans-serif" style="color: black; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space: pre;">Hatalarımızı yazmak oldukça önemli bir adım. Daha sonra bu hatalarımızı düzeltmek </span>için neler yapabiliriz diye düşünüp yanlarına farklı renkte bir kalemle yeniden notlar alabiliriz. (<a href="https://www.hasanyasar.com/bu-olaganustu-durumdan-sonra-ne-yapmaliyiz.html" style="font-size: 12pt; white-space: pre;" target="_blank">Hasan Yaşar</a><span style="font-size: 12pt; white-space: pre;">)
</span></li><li><span style="font-size: 12pt;">Günlük ne kadar hareket ettiğiniz vücudunuzu etkiler. </span>Ne kadar harcadığınız cebinizi etkiler.
Ne kadar okuduğunuz beyin sağlığınızı etkiler. (<a href="https://medium.com/t%C3%BCrkiye/2022de-hayat%C4%B1n%C4%B1z%C4%B1-zahmetsizce-i%CC%87yile%C5%9Ftirecek-50-mikro-al%C4%B1%C5%9Fkanl%C4%B1k-151bc32efc42" target="_blank">Hüseyin Güzel</a>)
</li></ul><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"></p><p><span> </span><span> Yazıyı tecrübe ile ilgili bir hadis-i şerif ile bitirelim.<br /></span></p><blockquote>❝Tökezlemeyen, halîm (akıllı) olmaz; tecrübe edinmeyen, hakîm olmaz.❞ </blockquote><blockquote>[ Hadis-i Şerif | Tirmizî, Birr, 86]</blockquote><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4Xh2lgNc1dJ-a12lMSH53CteshyY9-t6XDZITOXTnheUMvQFEsZNrm6Blcm9eLym7F_zZikzhuJSAyHTmjeWbjp10eU3xaTb2NScL9g9DrqUv6s75u-f8AYxOs8_fHz5NvqEPm-NnHTyRTjmBPofI0FAHyOeD0JoHgfSxegMGbrBaaCrbbTQ198ms96Vo/s620/free-palestine-quds-vector-illustration-600w-1970687537.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="620" data-original-width="600" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4Xh2lgNc1dJ-a12lMSH53CteshyY9-t6XDZITOXTnheUMvQFEsZNrm6Blcm9eLym7F_zZikzhuJSAyHTmjeWbjp10eU3xaTb2NScL9g9DrqUv6s75u-f8AYxOs8_fHz5NvqEPm-NnHTyRTjmBPofI0FAHyOeD0JoHgfSxegMGbrBaaCrbbTQ198ms96Vo/w620-h640/free-palestine-quds-vector-illustration-600w-1970687537.jpg" width="620" /></a></div><br /><p> </p><p></p>malik masishttp://www.blogger.com/profile/06624991798770591895noreply@blogger.com0tag:blogger.com,1999:blog-894742662176818755.post-88201909151111025942023-11-04T13:40:00.001-07:002024-02-25T11:52:19.234-08:00Okuduğum Yazarlardan Notlar 3 - Ürün ve Ürün Yönetimi Üzerine<p> <span> S.A. Arkadaşlar,</span></p><p> Takip ettiğim yazarlardan notlar serisinin 3.yazısı ile karşınızdayız. Bu yazıda da "ürün ve ürün yönetimi" üzerine <a href="https://aykutbal.medium.com/" target="_blank">Aykut Bal</a>'ın Medium'da yazdığı yazılardan toparladığım notları paylaşıyor olacağız. Ürün hakkında oldukça geniş bilgiye sahip olan yazarın<span style="font-family: inherit;"> neredeyse bütün yazılarını okudum ve kendime birçok notlar aldım, bunları da paylaşmak istiyorum. Bu konulara ilgi duyan arkadaşların bu yazıları tek tek okuyarak notlar almasını ve mümkünse ürünleri tarafında kullanmal</span>arını naçizane tavsiye ederim. Hazırsak başlayalım.<span></span></p><a name='more'></a><span id="docs-internal-guid-c7359c5e-7fff-d6a6-f5ca-0444f6872799"><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"></p><ul style="text-align: left;"><li><span style="font-size: 12pt; white-space-collapse: preserve;"><span style="font-family: inherit;">Büyümesini istediğiniz işiniz büyümüyorsa ve aklınıza gelen tek çıkış noktası x firmasıyla partnerlik yapıp bir kampanya üretmekten geçiyorsa bilin ki yanlış yola girmiş, koşar adım duvara doğru gidiyorsunuz.
</span></span></li><li><span style="font-family: inherit;">Deneyim totaldir. Müşteriye dokunsan da dokunmasan da başlattığın her aksiyondan bitene kadar sorumlusun ürün geliştiriyorsan. <br /><br /></span></li><li><span style="font-family: inherit;">Müşteriyi kazanmanın tek yolu o koca yeşil butonlar değil, keza kaybetmenin tek sebebi de o butonu doğru yere koymaman değil.<br /><br /></span></li><li><span style="font-family: inherit;">“Ben nasıl bir platform olurum?” sorusunu yanıtlaması gerekiyor. Nasıl bir platform olabilirim ki bir dış kaynak geliştirici bu ürüne katkı sunar?<br /><br /></span></li><li><span style="font-family: inherit;">Eğer bir girişime geldiyseniz; muhtemelen stresle dolu bir ortamda, oturmamış bir kültürün içerisinde, elinizde doğru düzgün bir "data seti" de bulunmadan kaosun ortasında yönünüzü bulmaya çalışacaksınız. Bu tablo karamsar gözükse de; eğer ‘mühendislik’ güdünüz ve analitik görünüz yeterince iyiyse; muhteşem bir başarı hikayesinin ucunda duruyor olabilirsiniz.<br /><br /></span></li><li><span style="font-family: inherit;">Oturmuş ürüne gelirseniz Aldığınız her karar, ürünü çevirdiğiniz her yön bu sefer ‘riskli’ olma tehlikesiyle karşı karşıya. Yapmak istediğiniz her değişiklik için kırmanız gereken duvarlar ve alışkanlıklar var. Böyle durumlar karşısında bizim kötü olanı düzeltmemize değil, ‘en iyisini yapma’ hırsımıza yenik düşmemize sebep oluyor.<br /><br /></span></li><li><span style="font-family: inherit;">Beni başarıya götürecek olan şey en iyi olduğum zaman nasıl olduğum değildi, en kötü, en enerjisiz hissettiğim zamanlarda dahi en iyi performansıma yakın bir görünüm sergilemekti.<br /><br /></span></li><li><span style="font-family: inherit;">Ne yazık ki yan projeler geleneksel anlayışla yönetilen şirketler için hala ‘odak kaybı’ ve ‘yönetilemeyecek ürün portfolyosu’ anlamına geliyor. Oysa o bir türlü ruh halini anlayamadığınız Y kuşağının şirket sadakatine sahip olmasının tek yolu bu yan projeler.<br /><br /></span></li><li><span style="font-family: inherit;">Kendimize sormamız gereken soru “biz girişimci miyiz?” değildi; onun yerine çok daha oturaklı, çok daha basit başka bir soru var şimdi bizim gündemimizde: “biz birlikte üretebilir miyiz?”.<br /><br /></span></li><li><span style="font-family: inherit;">Problemin büyük kısmı iki cümleyi art arda kuramayacak kadar Türkçe yoksunu olmamız, biliyorum. Kitap okumayan insanlardan yazı yazmasını istemek lüks. Ama en azından denesek?<br /><br /></span></li><li><span style="font-family: inherit;">Rakiplerin birbirinden eleman almaması ile ilgili serbest piyasa ekonomisinin ekmeğini buram buram yiyen adamlar; yetmiyor gibi üzerine bir de son parçayla tabağı sünnetlemeye çalışıyor.<br /><br /></span></li><li><span style="font-family: inherit;">Aranızda sadece 40 saat üzerine kurulu bir sözleşme var. Bu sözleşmenin ötesine geçmek istiyorsanız, yani sizin hayalinize değer verilsin istiyorsanız, onların da hayaline sizin değer vermeniz gerekiyor.<br /><br /></span></li><li><span style="font-family: inherit;">Ürün yöneticisi (PM) sorumlulukları ve yeteneklerine ihtiyaç duyulan bir ortamda, çeyrek zamanlı diğer rollerin yapılmaya çalışılması, ürüne maliyet ve gelir anlamında kısa dönemde faydalı olsa da, uzun dönemde yetişmiş çalışanların kaybedilmesi gibi pek çok zararı olabilmektedir.<br /><br /></span></li><li><span style="font-family: inherit;">PM yapılacak doğru iş belirlemeye çalışırken, PO doğru şeyi geliştirmeye çalışır. Bu cümleyi de bir adım açarsak; PM “NE?” sorusuna cevap bulmaya çalışır, PO ise “NASIL?” sorusuna.<br /><br /></span></li><li><span style="font-family: inherit;">Vasatla barıştığımız yerde bu yeni oyunu kaybederiz/kaybediyoruz. Uzaya çıkmak değil mevzu, gurur duyduğumuz işlerin sayısı bir elin parmaklarını geçmiyor.<br /><br /></span></li><li><span style="font-family: inherit;">Takımın başarısıyla şahsi başarınız arasında bir fark yok bu sektörde.</span></li><ul><li><span style="font-family: inherit;">İlk yaklaşım, “En Önemli” işleri yerleştirip kalan boşluğu doldurmak üzerine kurulu.</span></li><li><span style="font-family: inherit;">İkinci yaklaşım ortalama garantici ürün yöneticisi tercihi. 4 konu çözüme bağlanmış ama kimsenin içine sinmemiş durumda</span></li><li><span style="font-family: inherit;">Üçüncü yaklaşım ise kapatılan konu sayısına oynayan yaklaşım<br /><br /></span></li></ul><li><span style="font-family: inherit;">Bütün ürün yönetimi süreçlerini, disiplinin tamamını “empati” ile özetlemek mümkün<br /><br /></span></li><li><span style="font-family: inherit;">Dünyanız darsa eğer; istediğiniz kadar işle ilgili kitap okuyun, podcast dinleyin, bütün frameworkleri bilin bir anlamı olmuyor.</span></li></ul><div><span> </span><br /></div><div><span><span> </span><span> Yazıyı bir ayet-i kerime ile bitirelim.</span><br /></span></div><div><span><span></span></span></div><blockquote><div><span><span>“Allah’ın geçiminize dayanak olarak hayatın esası kıldığı mallarınızı aklı ermezlere vermeyin...”</span></span></div><div><span><span> (Nisâ, 4/5)</span></span></div></blockquote><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfhmQVacFEFR09EQe2dr9HDF6Sk_l-isHw2IS6hZ3SdAQiNS1jXPFOUT0HNeWWl7iunqrArUTpA-aY1weP1-0DDHZd30vxoMOIQCnSJNmDOWuim5C-1ACxZGuwzygcDTpXtTY901yqogMuVDTC5tL74qQPramLJzQRulZo0cRG_Q7zTFXck_C7R1afbDgq/s620/free-palestine-quds-vector-illustration-600w-1970687537.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="620" data-original-width="600" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfhmQVacFEFR09EQe2dr9HDF6Sk_l-isHw2IS6hZ3SdAQiNS1jXPFOUT0HNeWWl7iunqrArUTpA-aY1weP1-0DDHZd30vxoMOIQCnSJNmDOWuim5C-1ACxZGuwzygcDTpXtTY901yqogMuVDTC5tL74qQPramLJzQRulZo0cRG_Q7zTFXck_C7R1afbDgq/w620-h640/free-palestine-quds-vector-illustration-600w-1970687537.jpg" width="620" /></a></div><br /> <p></p><div><span><span></span></span></div><p></p></span><p></p>malik masishttp://www.blogger.com/profile/06624991798770591895noreply@blogger.com0tag:blogger.com,1999:blog-894742662176818755.post-58255634156045619182023-11-04T13:14:00.006-07:002024-02-25T11:52:50.739-08:00Okuduğum Yazarlardan Notlar 2 - Liderlik Üzerine<p> <span> S.A. Arkadaşlar,</span></p><p><span> Bir önceki yazıda okuyup takip ettiğim yazılardan aldığım notlar serisine başladığımı söylemiştim. Bugünkü yazımız ise liderlik/yöneticlik üzerine çok bilgili olan ve sürekli bu konuda kitaplar okuyan, yazan, eğitimler veren Mert Susur'un blog'dan aldığım notları paylaşacağım. Aldığım notlar kopyala-yapıştır olarak alınmıştır. <a href="https://www.mertsusur.com/" target="_blank">Sitesini</a> ziyaret ederek başlıklara göz atmanızı naçizane tavsiye ederim. <span></span></span></p><p><span>Not: Aralardaki çizgiler farklı yazılara ait notlar olduğunu göstermektedir.</span></p><a name='more'></a><p></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"></p><ul style="text-align: left;"><li><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Yapılan araştırmalarda iş tanımındaki belirsizliklerin kişilerde işsiz kalma stresinden daha fazla
sağlığa zarar verdiği görülmüş. (Son dönemde bu olaya yakın çevremden maalesef </span><span face="Roboto,sans-serif" style="color: black; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space: pre;">şahit </span>oldum.)</li></ul><p></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">---</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"></p><ul style="text-align: left;"><li><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Sizden daha tecrübeli yazılımcıların olması çok önemli. (Bir yerde en iyisi siz</span> iseniz gitme muhtemelen gelmiştir)</li><li><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Örneğin bir senior engineer’ın etki alanı kendi takımı iken, staff rolüne geçtiğinde </span>etki alanı grup, organizasyon ya da firma seviyesinde olabiliyor.</li><li><span face="Roboto, sans-serif" style="font-size: 12pt; white-space-collapse: preserve;">Görevleri ya da günlük sorumluluklarını çok iyi yaptıklarında hemen bir sonraki </span>seviyeye geçmeleri gerektiğini düşünen senior engineer’lar. (Kurumsal firmalarda o kadar da kolay değil.)</li><li><span face="Roboto, sans-serif" style="font-size: 12pt; white-space-collapse: preserve;">Eğer ileriye gitmek istiyorsanız öncelikle konfor alanınızın dışına çıkmayı göze alıp, toplantı yönetmek, uzun bir doküman yazarak ya da beyaz tahta karşısında diğer yazılımcıları ikna etmek, başka yazılımcıların yazdığı dokümanlara yorumlar yaparak ya da toplantılarda fikirlerini sınamak gibi daha önce deneyimlemediğiniz şeyleri yapmaya da hazır olmanız lazım. (Burası gerçekten çok önemli.)</span></li><li><span face="Roboto, sans-serif" style="font-size: 12pt; white-space-collapse: preserve;">Yazılımcılar karar verirken biz odada yoktuk diye yakınırlar ya, eğer etkiniz yoksa o odaya çağrılmazsınız. Peki odaya nasıl girip orada kalacağınızı biliyor musunuz? (kitaptan, sayfa 102) (Bunu okurken yüzüm bir düşmedi değil :)</span></li></ul><p></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">---</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"></p><ul style="text-align: left;"><li><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Özellikle kurumsal büyük firmaların bu konuya kafa yorup güzel ofis kurarak </span>ya da sürekli hediye göndererek çözüm ürettiklerini sanmaları.</li><li>“Inner Work Life” Bir çalışanın bir iş günü içinde algıladığı, hissettiği ve motive olduğu olayların tamamı diyebiliriz.</li><li>Çalıştığım neredeyse tüm firmalarda bu tarz anketler uygulandığını gördüm. Ancak şu anda çalıştığım firma dışında hiç bir zaman ciddiye alındığına tanık olmadım. (Bunu çalışana hissettirmek çok güzel bir şey.)</li><li>Çoğu zaman kontrolü ekibe vermenin, onları sorumlu haline getireceğini ve böylece işlerin sizden bağımsız yürümeye başlayacağını unutmayın. Ama bu, ekiple ilgilenmeyin demek de değil tabii ki!</li></ul><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">---</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"></p><ul style="text-align: left;"><li><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Çoğu firmalarda teslim tarihi ya da proje bitim tarihi ekipler tarafından değil, </span>sahadaki kısıtları bilmeden teslim tarihi veren yöneticiler tarafından belirleniyor olabilir. (Buna öncelikle iyi direnmek lazım, alttan üste bunun mantığı ısrarla anlatılmalı, ama kararı aldıktan sonra bunun için elden gelenin en iyisi yapılmalı.)</li><li>Sanırım artık her ekip bir şekilde retrospektif toplantısı yapıyor. Ancak bu toplantılardan çıkan aksiyonları ne kadar uyguluyor ve takip edebiliyorlar? (Çalışanın şirkte bağlılığı artıyor ve fikrinin önemsendiğini bildiği için kendini daha rahat ifade ediyor.)</li></ul><p></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">---</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"></p><ul style="text-align: left;"><li><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Eğer ben meşgulsem ve çok çalışıyorsam muhtemelen doğru bir şey yapıyordumdur” algısı.</span></li><li>Ekibi sınamak yerine kendinizi yanlışlıkla ekibe çözüm sunarken bulabilmeniz çok mümkün. Bu da haliyle ekibin kendi başına karar verebilme yetkinliğini riske atmaya başlamanız demek. (Bir durup düşünmekte fayda var)</li><li>“Sorun tanımı” dokümanı istemek en önemli adımlardan birisi olabilir. Bu dokümanın amacı, “Bu sorun neden bir sorun?”, “Bunu şimdi çözmezsek ne kaybederiz?”, “İyi bir çözümü bulduğumuzu nasıl anlarız?” gibi sorulara cevap vermek. (Gülümsedim okurken, bunu iyi ifade etmediğinizde neden beni dinlemiyorlar durumuna düşme ihtimalimiz çok yüksek...)</li></ul><p></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">---</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"></p><ul style="text-align: left;"><li><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Çoğu yazılımcı liderlik rollerine geçtiğinde zaman içerisinde etkilerini ölçememeye</span> ve bu yüzden de "acaba doğru mu yapıyorum" diye düşünmeye başlıyor. (Çok benzer bir olayı yakında zamanda yaşadım. Metrikler biraz daha geri plana düştüğü için bu kısmen normal gibi.)</li><li>Liderlik genellikle daha soyut hedeflere ve daha geniş etkilere sahiptir ve bu etkiler hemen görülmez. Hatta çoğu zaman bu etkileri görebilmek için günler, haftalar hatta bazense aylar gerekir.</li><li>Başarıya giden kapıyı açan anahtar başarı hırsı değil, başarısızlıklarla nasıl mücadale ettiğinizdir. ("Seni öldürmeyen şey güçlendirir")</li></ul><p></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">---</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"></p><ul style="text-align: left;"><li><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Eğer kariyerinizde ileri gitmek, ekip liderliği yapıyorsanız ekibinizi ileriye götürmek </span>için hesaplanmış riskler alarak doğru bildiğinizi savunmaktan ve sonuçlarından korkmayın. (Kendinizi ifade ettiğiniz kadar, nasıl ifade ettiğiniz de bir o kadar önemlidir.)</li></ul><p></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">---</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"></p><ul style="text-align: left;"><li><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Liderlik, bir ünvan veya pozisyondan ziyade bir davranış biçimidir ve </span>kişinin başkalarını etkileme ve yönlendirme yeteneğiyle ilgilidir. (Bence bu pozisyon bağımsız bir şeydir.)</li></ul><p></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">---</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"></p><ul style="text-align: left;"><li><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Özel hayatınızdaki yaşanan sorunları adeta bir ceket gibi işe gelince asıp </span>çıkarken giyinip gidemiyorsunuz. (Gerçekten de öyle, özellikle uzaktan çalışınca bu daha da böyle oluyor. Kariyerimin başında birlikte çalıştığım yeni çocuğu olan bir abimiz (evden çalışıyordu) 1 saati 1 saatini tutmuyordu. İnsanın çocuğu olunca bunu daha iyi anlayabiliyor ama o zaman çok da iyi anlamıyordum açıkçası.)</li></ul><p></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">---</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"></p><ul style="text-align: left;"><li><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Stres altında kötü gelişmelere verdiğimiz üç tepkinin ismini öğrenelim. </span>Küskünlük, öfke, soğukluk.</li><li>Öfkemizin asıl amacı kendimizi güçlü görebilmekken aslında gerçekten güçlü birinin buna ihtiyacı olmadığını göz ardı ederiz</li><li>Yazılım sektöründe başarılı bir kariyer için duygusal olgunluğa sahip olmak oldukça önemlidir. (Fevri davranışları bu tecrübe ölçüsünde azaltıyor olmamız lazım)</li></ul><p></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">---</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"></p><ul style="text-align: left;"><li><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">MVP aşamada neredeyse hiçbir şeyi otomatik hale getirmenize gerek yok, </span>hatta karmaşık teknik mimariler hazılamaya ve belki de iyi bir tasarıma da ihtiyacınız yok. (Benzer bir konu girişim ile ilgili yazıda da geçiyordu)</li></ul><p></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">---</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"></p><ul style="text-align: left;"><li><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Çoğu zaman takım lideri, gündelik koşturmacanın içine öylesine girerler ki en</span> önemli görevlerinden biri olan takım yönetmeyi atlamaya başlarlar. (Zamanla bunu da öğreniyorsunuz...)</li><li>Size ufak bir sır vereyim; Çoğu kişi verimli iletişim kurmayı ve delegasyon yapmayı aslında bilmiyor. (O yüzden iş yapmaktan çok, bu işi paylaşabilmek önemli)</li><li>Kendi cevaplarını kendileri bulduklarında yaşadıkları motivasyon artışı ve daha da önemlisi işe bağlılık artışı benim hakkımda ne düşündüklerinden çok daha önemli bir hal almaya başladı.</li><li>Eğer siz de benim gibi ekibin işini sahiplenmesini önemsiyorsanız ve Bay Wolf Sendromundan kurtulmak istiyorsanız size gelecek bir sonraki problemde karşınızdakine bu üç soruyu sorun;</li><ul><li><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Ne denedin?</span></li><li><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Başka ne denedin?</span></li><li><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Senin başarman için sana nasıl yardımcı olabilirim?</span></li></ul></ul><p></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">---</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"></p><ul style="text-align: left;"><li><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Ben ekiplere nasıl en az düzeyde karışarak onların hızlı ve daha başarılı olmalarını sağlıyorum.</span></li><li><span style="font-size: 12pt; white-space: pre;">Özellikle bir takım lideri ya da yönetici olarak bir ekibi yönetiyor ve ekibin ç</span>ıktılarından siz sorumlu oluyorsanız, o zaman ekibi yönetirken ister istemez bir çok olaya müdahale ediyor olabilirsiniz. Bu yazıda bu kötü alışkanları nasıl bırakacağınızdan bahsetmeyeceğim. (Bahsedilse iyi olmaz mıydı :) )</li><li>Performans = Potansiyel - İç Müdahale (Bu formülü gerçekten çok beğendim, üzerine iyi düşünmekte fayda var.)</li><li>Bir tenisçi koçu, her ne kadar koçluk yaptığı sporcu kadar iyi tenis oynamasa da o sporcunun potansiyeline ulaşması için doğru zamanda doğru bir şekilde ilerlemesine yardımcı oluyor.</li><li>Özellikle etrafınızda sizin gitmek istediğiniz zorlu yoldan geçmiş kimse yoksa kendinizi başarısız olma korkusuyla durduruyor olmanız çok insani bir durum.</li><li>Temelde bir koçun, koçluk yaptığı kişinin;</li><ul><li><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Yaptığı iş için yeterli kabiliyette olduğunu,</span></li><li><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Her işin altından kalkabileceğini,</span></li><li><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Çok yüksek bir potansiyelde olduğunu k</span>abul etmeli</li></ul><li><span style="font-size: 12pt; white-space: pre;">Mesela ekibimde az tecrübeli bir yazılımcı işe başlayacaksa onlar işe başlamadan </span>önce mentorlarını planlıyorum ve mentorunu onun geleceği günden önce hazırlamaya başlıyorum. (İşe yeni başlayan birisinin mentörü o işe alışmasındaki en önemli faktörlerden biri.)</li><li>Yeni bir yöntemi öğrenirken öncelikle geleneksel yöntemi deneyimlemeniz, sonra eleştirmeniz ve sonunda da kendi tarzınızı çıkartmanız lazım. Bu yönteme Shuhari (Şuhari) deniliyor. (Biz önce kolay olanı, eleştirmeyi yapıyoruz.)</li></ul><p></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">---</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"></p><ul style="text-align: left;"><li><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Koçluk; çalışanınıza yol göstererek kendi potansiyellerini</span> keşfetmelerine yardım etmekten mentörluk ise çalışanınıza bilgi ve tecrübenizi aktararak onların gelişmelerine yardım etmektir.</li><li>Çalıştığım en iyi yöneticilerin hepsi zamanında ve çok net şekilde geribildirim vermeyi çok iyi biliyorlar. (O kadar güzel bir nokta ki, bunu nasıl yaptığımız yine çok önemli)</li><li>Eğer ekibinizdeki kişilerden birisi kritik bir rolde (yönetici, takım lideri vs.), kritik bir projede kilit bir rolde (Büyük bir projenin lideri), çalışma performansında sorunlar yaşıyorsa, yeni zor bir role terfi olduysa ya da terfi olmak için çalışıyor ve çok yaklaştıysa o zaman bu toplantıları direkt olarak 1 saate çıkartmayı düşünebilirsiniz. (Tecrübe kokuyor, muhteşem...)</li><li>Sormayı en sevdiğim soru olan “Eğer bugün firmadan ayrılacak olsan sebebi ne olurdu?” sorusunu da sormaktan çekinmemeniz iyi olur. Böyle sorular ciddi şok etkisi yaratıp size hiç kimseden duyamacağınız şeyleri duymanıza yarayabilir.</li><li>Son olarak da bu görüşmeleri sakın iptal etmeyin. Mümkün olduğu sürece ertelemeye ya da saatini değiştirmeye çalışın. Karşı taraf bu toplantıyı iple çekiyor olabilir, bunu size hissettirmemiş olabilir. Ayrıca toplantıyı karşı tarafın sahiplenmesini sağlayın. (Gerçekten de öyle, benim en çok gelmesini istediğim toplantılarım 1-1 ve retro toplantıları...)</li><li>Toplantıya gelmeden önce hazırlık yapmanızı öneririm. Ekip ya da firma içindeki huzursuzluklarınızı, terfi için nerede olduğunuzu, firmadan beklentilerinizi ve kariyerinizde nereye gitmek istediğini düşünerek öncelikli bir şekilde bir toplantı gündemi hazır tutmanızı öneririm.</li><li>Son olarak, ne istediğinizi dolandırmadan direkt bir şekilde söylemeyi alışkanlık haline getirin.</li></ul><p></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">---</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"></p><ul style="text-align: left;"><li><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">CTO’su Daniel’a beklenen o can alıcı soruyu sordu: “Ne zaman biter?”. </span>Dan’ın cevabı otelin balo salonunda biri ölmüş gibi bir sessizlik yarattı: “İyimser olursam 2 ay, kötümser olursam 5 ay, ama gerçekçi olursam bilmiyorum.</li><li>Sağlıklı bir proje yönetimi için, belirsizliğin ya da zorluğun fazla olduğu yerlerden projelere başlamak gerekir. (Kolay yerden başlamanın da avantaj ve dezavatajları var, ama bu şekilde daha doğru tahminleme yapılabilir.)</li></ul><p></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">---</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"></p><ul style="text-align: left;"><li><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Belirsizlik konisi, eğer projenin başında biri size bu 10 gün sürer diyorsa, </span>aslında bu 2-40 gün arasında sürecektir.</li><li>Başlangıçta zor ya da belirsiz yerlere odaklanmak daha gerçekçi ve sürdürülebilir bir proje sürdürmenize yardımcı olacaktır. (Yukarıdaki nokta bunla ilgili, farklı yazılardan)</li></ul><p></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">---</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"></p><ul style="text-align: left;"><li><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">İstediğiniz kadar kitap okumuş, yöneticilikle ilgili bütün konferans</span> konuşmalarını dinlemiş ve aklınızda teorik bir “iyi yönetici” imajı oluşmuş olabilir. Ancak siz, yeni bir yönetici olarak bunların hepsini tecrübe edecek, çoğu zaman başarısız olacaksınız. (Jr iken nasıl izlediğimiz uyguladığımız şeyler bizi sr yapmıyorsa bu da öyle bir şey olsa gerek, tecrübe çok farklı bir olay.)</li><li>Hata yaptığınızda hatanızı herkesle paylaşmak ve ne öğrendiğinizi göstermeniz sizi küçültmeyecek aksine daha güçlü ve güvenilir bir lider haline getirecektir. (Ah ne güzel dilekler...)</li></ul><p></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">---</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"></p><ul style="text-align: left;"><li><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Yeni biril girişimde yazılımcılarınızın yazacağı kodun kalitesine göre değil, </span>hızlı bir şekilde üretime göre optimize olmalısınız. (Yine girişim, yine hız)</li><li>Çoğu yazılım ekibi ürün yöneticisini “hiç teknik işlere zaman ayırmıyor” diye suçlarken, ürün yöneticisi de yazılımcıları “hep over-engineering yapıyor” diye suçlar. Bu özellikle iyi bir ürün geliştirme kültürü olmayan ekipler için önemli bir sorundur. (Dengelemek burada da yine önemli bir faktör.)</li><li>Eğer ekibinizde önceliklendirme yaparken çok güzel fikirlerinizden vazgeçmiyorsanız, çok hoşunuza gidecek özellikleri ileriye atmıyorsanız yani canınız yanmıyorsa muhtemelen yanlış yapıyorsunuz. (Biz şu an tam da o acıyı çekiyoruz.)</li></ul><p></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">---</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"></p><ul style="text-align: left;"><li><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Yazılımcılar” ve “Ürün takımı” gibi ayrımlara yol açabiliyor. </span>Bir nokta sonra bu kötü kültür “Biz” ve “Onlar” ayrımına gidiyor. Sonuçta bedelini de firma ödüyor. (Aslında herkes ödüyor, çok güzel bir ekibi dağıtmış oluyorsunuz belki de...)</li></ul><p></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">---</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 12pt;"></p><ul style="text-align: left;"><li><span face="Roboto,sans-serif" style="background-color: transparent; color: black; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Sürekli geribildirim alıp sürekli öğrenmek, kısa aralıklarla kendinizi </span><span face="Roboto,sans-serif" style="color: black; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space: pre;">geliştirmek kariyerlerinde
</span><span face="Roboto,sans-serif" style="color: black; font-size: 12pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space: pre;">hızlı ilerleyen kişilerin farkında olarak ya da olmadan </span>uyguladığı gizli reçetelerden birisidir. (Can alıcı bir nokta daha, geri bildirimin önemi çok fazla, bunu zamanla anlıyoruz.)</li></ul><div>---</div><p></p><p><span> Yazıyı konuyla ilgili bir hadis-i şerifle bitirelim.</span></p><p></p><blockquote>İbni Ömer radıyallahu anhümâ’dan rivayet edildiğine göre Peygamber aleyhisselâm şöyle buyurdu: </blockquote><blockquote>“Hepiniz çobansınız. Hepiniz güttüğünüz sürüden sorumlusunuz. Âmir memurlarının çobanıdır. Erkek ailesinin çobanıdır. Kadın da evinin ve çocuğunun çobanıdır. Netice itibariyle hepiniz çobansınız ve hepiniz idâre ettiklerinizden sorumlusunuz.” </blockquote><blockquote>(Buhârî, Cum`a 11, İstikrâz 20, İtk 17, 19, Vesâyâ 9, Nikâh 81, 90, Ahkâm 1; Müslim, İmâre 20. Ayrıca bk. Ebû Dâvûd, İmâre 1, 13; Tirmizî, Cihâd 27)</blockquote><p> </p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHpQ_zgaLldHrzfLAbivSdK-oLUW28QCrnxZXwNSYxaSU5JXCuXHV15gZpFZpWQQZc1zApLIqFngK47KYB6rlD11BJOQV4BJ17MxWhws2cpUQK_kY-3j6sJONyNXXGY_VT2BOoqZNxd6Xxekk9RruI1AxrMiSGp7P_KmEdwhcxIOiLm3BC32MMf8BFG6NZ/s620/free-palestine-quds-vector-illustration-600w-1970687537.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="620" data-original-width="600" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHpQ_zgaLldHrzfLAbivSdK-oLUW28QCrnxZXwNSYxaSU5JXCuXHV15gZpFZpWQQZc1zApLIqFngK47KYB6rlD11BJOQV4BJ17MxWhws2cpUQK_kY-3j6sJONyNXXGY_VT2BOoqZNxd6Xxekk9RruI1AxrMiSGp7P_KmEdwhcxIOiLm3BC32MMf8BFG6NZ/w620-h640/free-palestine-quds-vector-illustration-600w-1970687537.jpg" width="620" /></a></div><br /><p></p><p></p>malik masishttp://www.blogger.com/profile/06624991798770591895noreply@blogger.com0tag:blogger.com,1999:blog-894742662176818755.post-35952729998339208872023-11-04T08:56:00.008-07:002024-02-25T11:50:34.362-08:00Okuduğum Yazarlardan Notlar 1 - Girişim Üzerine<p> <span> S.A. Arkadaşlar,</span></p><p><span> Uzun süredir okuduğum/takip ettiğim yazarlardan belirli konularda notlar alıyorum. O notları zaman zaman dönüp gözden geçiriyordum. Bunları bir seri olarak paylaşmayım belki başka okumak isteyenler de olur dedim. Bugünkü konumuz girişim üzerine, notları aldığım yazar ise Celil Bozkurt'un "<a href="https://celil.medium.com/giri%C5%9Fim-%C5%9Firketim-neden-batt%C4%B1-1-fikir-b74d2e1517f6" target="_blank">Girişimim Nasıl Battı?</a>" adlı serisinden. Kendisini uzun yıllar önce tanıdım ve bu konuda çok güzel içerikler üretiyor. Notları hiç düzenlemeden kopyala-yapıştır olarak aldığımı tekrardan belirtmek isterim. Yazıların tamamını okumanızı naçizane tavsiye ederim. Hazırsak başlayalım.<span></span></span></p><a name='more'></a><p></p><ul style="text-align: left;"><li>Sürecin sonunda, girişim şirketlerinin %85’inin başına gelen sonuç bizim de başımıza geldi. (Kimi verilere göre 75 kimilerine göre 90 oranına kadar bile çıkabiliyor, ama gerçek olan bir şey var ki çoğu maalesef ayakta kalamıyor, zor süreçler, ama şahsi fikrim başarısız olunsa dahi bir süre sonra tekrar deneyebilmek gerekiyor.)<br /><br /></li><li> Çevremde gördüğüm birçok girişimci bir soruna çözüm getirmek için değil, daha fazla gelir elde etmek için girişim kuruyor. (Maalesef özellikle bu sayı daha fazla olabilir, ama yine maalesef ki çok da suçlayamıyorum insanları ...)<br /><br /></li><li>Sevdiğiniz fikir için değil, hayran olduğunuz fikir için girişimci olun. (Birkaç defa sevdiğimiz fikir için uğraştık ama gerçekten de hayran olduğunuz fikir ve onu yorulmadan götürebilecek bir takım çok önemli)<br /><br /></li><li>Prototipinize veya ürününüzün ilk haline sadece ve sadece gerekli özellikleri ekleyin. (Kesinlikle, yoksa bitmiyor. "Çıktığınız üründen utanmıyorsanız geç kalmışsınız demektir")<br /><br /></li><li>En az özellik ve en hızlı zamanda ürün çıkartıp fikrin uygulanabilirliğini test edin. <br /><br /></li><li>Ürünün ilk sürümünde hedef kitlenize uygun az ama uygulamanızı seven kullanıcılar bulmaya başlayın. <br /><br /></li><li>Girişim şirketimizde kullanıcıların sıklıkla dile getirdiği bir özelliği ürüne eklediğimizde organik büyüme rakamlarında değişiklikler olduğunu test etmiştik. Fakat buna rağmen kullanıcı odaklı düşünmeyi prensip haline getirememek en büyük hatamızdı. (Bir arkadaşım da reklam vermedikleri sürece uygulamalarının kullanılmadığını söylemişti, o yüzden organik büyüme gerçekten çok önemli)<br /><br /></li><li>Girişimci, inandığı fikir için yetenekli insanlardan ekip oluşturan kişiye denir. (Yetenek önemli ama sabır ve uyum bence çok daha uyumlu)<br /><br /></li><li>Türkiye’de insanların ortaklık konusunda genellikle sıkıntılar yaşadığını görüyorum. Yanlış bir şekilde sahip olduğumuz “patron” ibaresi ortaklık kurmamızda veya kurulan ortaklıkların devam etmesi konusunda bize büyük sıkıntılar yaşatabiliyor. Bunun kötü bir gelenek olduğunu ve kırmanız gerektiğini söylemek zorundayım. (Hiç bu aşama kadar gelemedik, ama insanlar ilişkileri hep çok zor olmuştur.)<br /><br /></li><li>Bir girişimin sağlıklı olarak yürüyebilmesi için en az 2 kurucu ortak gerekli. Bu rakamın 3 ya da 4 olması da ideal. 4'den fazla kurucu ortağı olan şirketlerde hedef farklılıkları olabildiği gözlenmiş. (2 kişi için karar almak güç iken, 3 kişide ise 2'ye 1 kutuplaşma tehlikesi var.)<br /><br /></li><li>Kurucu ortağınızı mümkün olduğunda eksik olduğunuz konularda uzman kişilerden seçmeye çalışın. Bunun için ekosistemde dolaşan en ideal öneri hacker, hipster, hustler üçlüsüdür. (Başlıngıç için bizimkiler genelde yazılımcı oluyor :)<br /><br /></li><li>Kurucu ortaklarınızı öyle bir seçmelisiniz ki, şirketiniz hiç kimseyi işe almadan bile ürününü müşterisine ulaştırabilme gücüne sahip olsun. (Özellikle yazılımcı kısmı için ürünü pazarlayan ve piyasayı bilen biri olmazsa olmaz.)<br /><br /></li><li>Özellikle ilk çalışanlara belirli oranlarda hisse vermeniz kişilerin maddi anlamda kendilerini güvende hissetmelerini sağlar. (Mantıklı ama Türkiye şartlarında pek gerçekçi değil.)<br /><br /></li><li>Hızlı düşünün, hızlı tartışın ve hızlıca çözüme gidin. (Startup'ların belki en güçlü yanı hızlı olabilmeleri.)<br /><br /></li><li>Uzun toplantılardan, araya girebilecek gereksiz işlerden kurtulun.<br /><br /></li><li>İlk 1 yıl içerisinde ne kadar paraya ihtiyacınız olduğunu hesaplamaya çalışın. Nereye ne kadar harcama yapacağınızı madde madde listeleyin. (İşten istifa etmeden bu işleri yürütmek son dönemlerde daha popüler ama çok da yorucu)<br /><br /></li><li>Yatırımcıyı para veren kişi olarak görmek son derece yanlıştır. (Üzülerek söylemek zorundayım ki öyle)<br /><br /></li><li>Sektörü iyi bilen ve deneyimli bir kişiden yatırım almak aynı zamanda o kişiyi şirket yönetimine dahil etmek demektir. Bu da onun deneyim ve tecrübelerinden faydalanarak şirketi daha iyi bir konuma getirebileceğiniz anlamına gelir.<br /><br /></li><li>Kendi özsermaye kullanımının girişim şirketlerinde sadece ilk başlarda ya da belirli bir seviyeye kadar olması gerektiğini söyleyebiliriz.<br /><br /></li><li>Girişim şirketleri para amacıyla kurulamaz, kurulmamalıdır. Amaç para olmamalı !! <br /><br /></li><li>Ürünü ortaya çıkarmak için 1 tasarımcı ve 1 yazılımcıya ihtiyacınız olsun, ürün ortaya çıktıktan sonra ürününüzü satabilmek için de 1 satış uzmanına ihtiyac var.</li></ul><div><blockquote>"Yeryüzünü size boyun eğdiren (ondan yararlanmanız için size itâat ettiren) Allah Teâlâ'dır. O halde yeryüzünün sırtlarında (dağlarında, tepelerinde ve ovalarında) dolaşın da Allah'ın size verdiği rızıklardan yararlanın."(Mülk, 67/15).</blockquote><p> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEd3Rdu6mfzVB7s09pxQBRfzKUlOcVZAcNO9rpzuR8t48gMcC7s6yky_wVJwAXX_IzYoz7FzVfC7-Dynh3ZTzi1HcQGqb3A0pqccB7wELOlqUh8NKFgzX8gLM5797AzKmZouV9gQS05FmMeKpyOU-XqN5mzZkU6vYo-2a-Xuwr9_qG1PgwaKpdEhi9x-qk/s620/free-palestine-quds-vector-illustration-600w-1970687537.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="620" data-original-width="600" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEd3Rdu6mfzVB7s09pxQBRfzKUlOcVZAcNO9rpzuR8t48gMcC7s6yky_wVJwAXX_IzYoz7FzVfC7-Dynh3ZTzi1HcQGqb3A0pqccB7wELOlqUh8NKFgzX8gLM5797AzKmZouV9gQS05FmMeKpyOU-XqN5mzZkU6vYo-2a-Xuwr9_qG1PgwaKpdEhi9x-qk/w620-h640/free-palestine-quds-vector-illustration-600w-1970687537.jpg" width="620" /></a></p></div><p></p>malik masishttp://www.blogger.com/profile/06624991798770591895noreply@blogger.com0tag:blogger.com,1999:blog-894742662176818755.post-64575009600319032252023-10-30T13:06:00.004-07:002024-02-25T11:51:23.695-08:00Ekip Bölünmesi ve Duygusal Adaptasyon: Bir Yazılımcının Anlatısı<p> <span> S.A. Arkadaşlar,<br /><span> Bugün ufaktan da olsa duygusal bir yazı yazıyor olabilirim :) Yazılımcılık dışarıdan sanıldığı gibi asosyal bir meslek değil, tam tersine teknik olmayan yeteneklerin (soft skill) kimi zaman teknik yeteneklerin önüne de geçecek kadar önemli olduğu bir meslek dalı. Bu yetenekler devreye girdiğinde de ister istemez kalbi duygular da devreye giriyor. Konumuz iş dünyası da olsa, duygu ve düşüncelerin birlikte nasıl yola çıktıklarını anlatmaya gayret edeceğiz. Hazırsak başlayalım.<span></span></span></span></p><a name='more'></a><span> Çalıştığım yer büyük olsa da, yazılım kısmında startup'tan scale-up'e geçmeye çalışan bir şirket. Bunun güzel ve zor birçok yanı olduğunu muhtemelen biliyorsunuzdur. Bu zorluklardan biri de önceliklerin çok hızlı bir şekilde değişiyor olabilmesidir. Bu değişiklikler çok farklılık gösterse de ben bu yazı genelinde beni etkileyen projeler arası geçişten (context switch) bahsediyor olacağım.</span><br /><p></p><p><span><span><span> İlk başladığımda ekip nispeten küçüktü, odak noktamız ise sadece BinBin ürünüydü. Bu ürünü dotnet framework'tan dotnet'e (bildiğiniz üzere dotnet 5 ile berbaer artık dotnet core demiyoruz ) geçişini yapmak (re-platform) üzere çalışıyorduk. Bununla ilgili gerekli çalışmaları yapmaya devam ederken, bir tandan ekibimize yeni arkadaşlar da katmaya devam ediyoruz. Bu zaman zarfının üzerinden çok vakit geçmemişti ki GoSharing şirketini de satın aldık, bir yanda da QCharge projemiz dışarıdan (outsource) geliştiriliyordu. O küçük ekibin dertleri git gide daha da büyüyordu, ekip de aynı şekilde ...</span><br /></span></span></p><p><span><span><span><span> QCharge elektrikli şarj işlemi yapan bir firma. Bu projeler kapsamında, şarj ünitesi ile (IoT) konuşması gereken bir proje geldi ve bu bizim sorumluluğumuzda olacak idi, buradaki geliştirmeleri hızlandırmamız gerekiyordu. Yöneticim gelip bizim bu projede acil desteğe ihtiyacımız olduğunu söyleyerek benim oraya geçmem için fikrimi sordu. Tam BinBin yavaştan alışmaya başlamıştım ki, buraya geçmeli miyim diye düşündüm, sonunda tamam diyerek orada sıkı bir şekilde çalışarak cihazla iletişimi MVP kapsamında tamamlamayı başardık. Sancılı ama güzel vakitlerdi.</span><br /></span></span></span></p><p><span><span><span><span><span> Orada yapılan geliştirmeleri tamamlayarak artık GoSharing uygulamasına dönme kararı aldık. Orada da geliştirme yapmaya ufak ufak başladık, 2.nci sprint tamamlanmamıştı ki, yeni yöneticim (QCharge ile birlikte diğer takıma geçtim :) ) bir projede çalışan 3 arkadaşımız geliştirmelere hızlı bir şekilde devam ettiği fakat buraya kısa süreliğine de olsa bir destek lazım olduğunu söylediler. QCharge tarafında birlikte çalıştığımız Ceyda ile birlikte buraya da destek verdik ve bu ürünü de diğer arkadaşlarla birlikte test edilecek seviyeye getirerek GoSharing uygulamasına devam eden ekibimze katıldık. Burada geliştirmeler devam ediyor iken BinBin tarafında bekleyen işler olması sebebiyle diğer ekiplerle birlikte yıl sonuna kadar bu tarafta çalışmaya karar verdik.</span><br /></span></span></span></span></p><p><span><span><span><span><span><span> Tekrardan ilk göz ağrım projeye dönüp geliştirmeler, düzeltmelere devam ediyoruz. QCharge projesinde sürekli çalışacak bir ekibe ihtiyacı olduğunun farkındaydık. Daha önceden de o projede çalışan kişiler olarak ilk bize gelindi. (Bu arada daha önce birlikte çalıştığım yerden Fatih de ekibimze dahil olmuştu, gerçekten uzun süredir kendimi bu kadar rahat hissetmemeiştim, her şey çok iyi gidiyordu) QCharge tarafını geçmek isteyip istemediğimiz soruldu :) Ekip olarak geçebileceğimizi bunun bizim için problem olmayacağını söyledik, fakat tüm ekibin oraya fazla olacağını ilk aşamada parçalanma gerektiğini ifade edince yüzler düştü tabii bizim :). </span><br /></span></span></span></span></span></p><p><span><span><span><span><span><span><span> Kalmak veya ekipçe gitmek bizim için çok da problem değildi, fakat hem bizim kariyerimiz hem şirketin planları doğrultusunda ekibi bölmek aslında daha mantıklı. Ekipçe bölünmek istemesek de bunu kabul ettik. Oturup birlikte konuştuğumuzda bunun bizim için zor olduğuna hemfikir olsak da ekip bölünmesinin kariyerlerimiz için daha iyi olacağına karar verdik.</span><br /></span></span></span></span></span></span></p><p><span><span><span><span><span><span><span><span> Bu kararı verdik vermesine, hala birlikte çalışıyoruz, diğer ekibin QCharge tarafına ne zaman geçeceği netleşme aşamasında. Kararı versek de gitme vakti yaklaştıkça hüzün kaplıyor insanı. "Ayrılıklar da sevdaya dahil" diyordu gerçi şair. Çok mu duygusal davranıyoruz bilemiyorum ama duygu dünyam biraz kabarınca düşüncelerimizi kelimelere dökme işi bana kaldı. </span><br /></span></span></span></span></span></span></span></p><p><span><span><span><span><span><span><span><span><span> Bu işin duygusal kısmı bir yana bu kadar hızlı bir şekilde farklı projelere adapte olup oralarda güzel işler çıkarmak açıkçası bize çok şeyler kattığını itiraf etmem gerek, zor süreçler geçirdiğimizi ifade etmek şartıyla...</span></span></span></span></span></span></span></span></span></p><p><span><span><span><span><span><span><span><span><span><span> </span>Tüm bu süreçleri birlikte göğüslediğimiz arkadaşlarımızın hepsine teşekkür ederken, oradan oraya memur edasıyla savrulan yol arkadaşım ve bu yazıyı yazmama vesile olan Ceyda'ya özel bir teşekkür etmek istiyorum. </span></span></span></span></span></span></span></span></span></p><p><span><span><span><span><span><span><span><span><span><span> Yazıyı aşağıdaki hadis-i şerifle bitirelim.</span><br /></span></span></span></span></span></span></span></span></span></p><p><span><span><span><span><span><span><span><span><span><span></span></span></span></span></span></span></span></span></span></span></p><blockquote>“Mü’minler birbirlerini sevmekte, birbirlerine acımakta ve birbirlerini korumakta bir vücuda benzerler. Vücudun bir uzvu hasta olduğu zaman, diğer uzuvlar da bu sebeple uykusuzluğa ve ateşli hastalığa tutulurlar.” Buhârî, Edeb 27; Müslim, Birr 66</blockquote><p> </p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVBXNkijDimX91iUumZ0yOn-SCPiO4m_8k3bpo8s3QuRPSRg3e3FII7f0UWUfSYGfaYDCXodNbxxO3QEUrTvvokApvFxinl3Mle0JpzWWBWzjfxJ11TZl-OssKbdd5sc1FuR1jQuSVH-2t1S6WvEyIYZgMLQJc40GFNlPEEDyK4LMMwBlYA3CZV_tnUCHF/s620/free-palestine-quds-vector-illustration-600w-1970687537.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="620" data-original-width="600" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVBXNkijDimX91iUumZ0yOn-SCPiO4m_8k3bpo8s3QuRPSRg3e3FII7f0UWUfSYGfaYDCXodNbxxO3QEUrTvvokApvFxinl3Mle0JpzWWBWzjfxJ11TZl-OssKbdd5sc1FuR1jQuSVH-2t1S6WvEyIYZgMLQJc40GFNlPEEDyK4LMMwBlYA3CZV_tnUCHF/w620-h640/free-palestine-quds-vector-illustration-600w-1970687537.jpg" width="620" /></a></div><br /><p></p><p></p>malik masishttp://www.blogger.com/profile/06624991798770591895noreply@blogger.com0tag:blogger.com,1999:blog-894742662176818755.post-20885694358583669182023-10-10T11:57:00.003-07:002023-11-12T09:06:18.977-08:00İyi Yazılımcı, Daha İyi Yazılımcı<p> <span> S.A. Arkadaşlar,</span></p><p><span><span> Geçenlerde okuduğum iyi ürün yönetici ve daha iyi ürün yöneticisi(yazıyı aradım maalesef bulamadım, aynı isimli kitabın özetiydi diye aklımda kalmış) adlı bir blog yazısı okumuştum. O yazıyı okuyunca her zaman kullandığım "iyi yazılımcı debug yapar, daha iyi yazılımcı log okur" (bir yerden okumuştum), sözü aklıma geldi ve bu 2 noktadan yola çıkarak ben de bu yazıyı yazmaya karar verdim. Hazırsak başlayalım...<span></span></span></span></p><a name='more'></a><div><span> İyi yazılımcı kodunu</span> güzelce yazar, daha iyi yazılımcı yaptığı kodun test ve dokümantasyonunu da yazar. Yazılımda kodu yazmak ne kadar değerliyse yazılan kodun testini ve dokümantasyonunu yazmak da bir o kadar değerlidir. Bu hemen yaptığınız işi sağlam yapmanızı sağlar hem de bu işi neden ve nasıl yapılacağını da tüm ekibe net bir şekilde anlatmış olur.</div><div><br /></div><div><span> İyi yazılımcı işini iyi yapar, daha iyi yazılımcı yaptığı iyi işi ayrıca anlatır. Yazılımcılara asosyal insanlar deseler de bu işin aslı sosyallik bence. Yaptığımız işin önemi kadar onu anlatıp, ekiple paylaşıp onu görünür kılabilmek de en az o kadar önemlidir.</span><br /></div><div><span><br /></span></div><div><span> İyi yazılımcı k</span>endini geliştirir, daha iyi yazılımcı yanındakileri de geliştirir. Bizim mesleğin olmazsa olmazı belki de hızlı gelişen teknolojiye karşı kendini güncel tutmaktır. Bunun önemli olduğu doğru, fakat bununla birlikte ekip arkadaşlarının da gelişimine katkı sağlamak da önemli.</div><div><br /></div><div><span> İyi yazılımcı v</span>erilen işi yapar, daha iyi yazılımcı sorumlulık alır. Birçok durumda bize verilen işi eksiksiz yapmaya çalışırız, ama bazen sorumluluk alıp o verilen işin diğer gerekliliklerini yapmamız gerekir. Bu bazen başka bir ekibi harekete geçirmektir, bazen düşünülemeyen işi düşünmektir, kısacası taşın altına eline sokmaktır.</div><div> </div><div><span> İyi yazılımcı c</span>ode-review yapar, daha iyi yazılımcı gerekirse pair de olur. Yazılan kodları zaman zaman inceliyoruz, varsa gördüğümüz eksikler geri bildirimlerde bulunuyoruz. Bunun belki de daha iyisi gerektiğinde bu geri bildirimlerin üzerinde birlikte çalışarak geçip bunları daha iyi paylaşmak olacaktır.</div><div><br /></div><div><span> İyi yazılımcı y</span>ardım istenildiğinde eder, daha iyi yazılımcı yardım istenmeden de gerektiğinde yardım etmeyi teklif eder. Yardım istenildiğinde yardım eden yazılımcı çok istenilen bir şeydir (bu konuda tek başına bir yazıyı hak eder), fakat yardım istenmeden de arkadaşının karın ağrısını hissettiğinde ona yardım teklif eden yazılımcı nimettir.</div><div> </div><div><span> İyi yazılımcı p</span>roblem olduğunda çözer, iyi daha yazılımcı problemi önceden öngörüp çözer. Çıkan bir problemi hızlı bir şekilde çözmek güzel bir özelliktir, fakat potansiyel oluşabilecek probleme önceden set çekmek daha da güzel bir özelliktir.</div><div><br /></div><div><span> İyi yazılımcı k</span>odu bulduğu gibi bırakır, daha iyi yazılımcı kod bulduğundan daha temiz bırakır. Her yazılımcı kodu temiz yazmayı hedefler ama farklı durumlardan bunu başaramayabilir. İyi yazılımcı eline aldığı kodu en azından bulduğu gibi bırakır, ama daha iyi yazılımcı bunu mümkün mertebe refactor eder, eksikliklerini gidermeye çalışır, özetle bulduğundan daha iyi bırakmaya özen gösterir.</div><div> </div><div><span> İyi yazılımcının t</span>eknik ekiple iletişimi kuvvetlidir, daha iyi yazılımcının müşteriyle de iletişimi kuvvetlidir. İletişimin bizim meslekteki kıymeti çok bilinmese de en az teknik yetenekler kadar önemlidir ve bunu başarabilen yazılımcılar bütüncül olarak baktığınızda çok daha iyidirler (bence). İyi yazılımcı bu iletişimi kendi ekibiyle iyi yapabiliyor iken, daha iyi yazılımcı teknik olmayan ekiplerle de bu iletişimi iyi yapar.</div><div><br /></div><div><span> İyi yazılımcı v</span>arsa eksikleri belirtir, daha iyi yazılımcı çözüm önerisi de sunar. Bir hatayı bulup onu tespit etmek önemlidir, fakat bu hataya bir çözüm önerisi sumak daha da önemlidir. Bazen problemden birçoğumuz şikayetçi olur, ama azımız çözüm önerisiyle gelir.</div><div> </div><div><span> İyi yazılımcı yorum satırı</span> yazar, daha iyi yazılımcı yorum satırına ihtiyaç olmayan kodu yazar. Tartışılan bir konudur belki de yorum satırı yazmak (yazmamak lazım diyenler de var çünkü), ama daha iyi yazılımcı bu yorum satırlarına ihtiyaç duyulmayacak şekilde kodu yazmaya özen gösterir.</div><div><br /></div><div><span> </span>İyi yazılımcı kodu testçiden geçince arkasına yaslanır, daha iyi yazılımcı kodu canlıya çıkınca arkasına yaslanır. Kodun test aşamasından geçmesi insanı gerçekten rahatlatır ve oh bu işi de kapattık gibi düşünebiliriz, ama asıl önemli olan bu kod canlıya çıkıp kullanılmaya başladığında rahatlamalı (bu bile yetmez, canlıdan hata gelirse daha çok terleyebiliriz :) ).</div><div><br /></div><div><span> Özetle işini iyi yapan yazılımcılara ek olarak verilenin/istenilenin ötesine geçip gerektiğinde sorumluluk da alan yazılımcılara selam olsun :)</span><br /></div><div><br /></div><div><span> Yazıyı Kehf suresinin 30.ayetiyle bitirelim.</span><br /></div><div><span><blockquote>İman edip dünya ve âhiret için yararlı işler yapanlar bilmelidirler ki, biz güzel iş yapanların ecrini asla zâyi etmeyiz.</blockquote><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBNZH6pnY4j3OLEqNK-ZMfIowWcoZKgie_r106yXr-F1VEwiGGV4wExGhp3UtfqJZApjGKEoW9lsNeooJz_M1NZVeh7zBa2KjH8Egucdsh_FXdC9kanFH5PpjJ3BSMK8MPnlFWgrHk6owQCdv1bIjHe6_iGXBg_To2qs9wB5N5tf8tQjHZHfanrlXNs8OJ/s620/free-palestine-quds-vector-illustration-600w-1970687537.webp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="620" data-original-width="600" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBNZH6pnY4j3OLEqNK-ZMfIowWcoZKgie_r106yXr-F1VEwiGGV4wExGhp3UtfqJZApjGKEoW9lsNeooJz_M1NZVeh7zBa2KjH8Egucdsh_FXdC9kanFH5PpjJ3BSMK8MPnlFWgrHk6owQCdv1bIjHe6_iGXBg_To2qs9wB5N5tf8tQjHZHfanrlXNs8OJ/w621-h640/free-palestine-quds-vector-illustration-600w-1970687537.webp" width="621" /></a></div><br /> <p></p></span></div>malik masishttp://www.blogger.com/profile/06624991798770591895noreply@blogger.com0tag:blogger.com,1999:blog-894742662176818755.post-52628804873025291882023-09-22T01:30:00.000-07:002023-09-22T01:30:05.589-07:00Zorluklar İnsanı Güçlendirir mi Yıldırır mı?<p> <span> S.A. Arkadaşlar,</span></p><p><span><span> Sanırım 15 yıldan fazla oldu. Liseye giriş sınavı puanları açıklanmıştı. Puan beklentimin altında gelmiş, oldukça üzülmüştüm, o zaman babam bana (meğer o da N</span></span>ietzsche'dan almış :)), "Bizi öldürmeyen şey güçlendirir" demişti. Gerçekten de öyle oldu. Mücadele ettikçe hayat devam ediyor. "Kaybettiğinde değil vazgeçtiğinde kaybedersin" diye boşuna dememişler. Bize mücadeleye devam etmeyi bahşeden Rabb'ime hamdü senalar olsun.</p><a name='more'></a><span> O çocukluk anısıyla başlayan serüven, hayatım boyunca başka şekillerle karşıma çıktı. Bahsettiğim sene mahalledeki anadolu lisesi değil Gaziemir Anadolu Lisesine (nispeten uzak) kaydolmuştum, çok geçmeden iyi ki buraya gelmişim dedim. Üniversiteye giriş sınavında da bir üst tercihim 9 Eylül Bilgisayar Mühendisliği tutmadı, hemen altındaki Kocaeli Üniversitesini kazandım. Yaşadığım şehirden, ailemden uzağa gitmek zorunda kaldım. Dönüp baktığımda yine birçok hayırlar varmış diyorum. </span><br /><p></p><p><span><span><span> Profesyonel kariyer yaşamıma Java ile başlangıç yapmıştım, orada da farklı zorluklar yaşadım. Hem Java'nın farklı zorlukları hem profesyonel dünyaya yeni adım atıyor olmak hem de özel sektörün acımasızlığı üst üste eklenince zor zamanlar geçirdim. Çok sevdiğim mesleğimi bırakma noktasına geldim, ama bir şekilde tekrardan tutunmak nasip oldu. </span></span></span></p><p><span><span><span><span> Tekrardan işe başladığım bu serüven de çok kolay olmadı açıkçası. Çalışmak için anlaşarak geldiğim firmadan maalesef 2 gün sonra ayrılmak zorunda kalmıştım. Tecrübe gerçekten acılar sonrası elde ediliyor, bu da öyle bir örnekti. Arkadaş/Abi dediğim birinin yanına şartları konuşmadan gelirsen sonucu da böyle oluyor maalesef. İstanbul'a yeni gelmiştim (2.defa), tekrar dönmek de istemiyorum. Arkadaşlarımın yanında yaklaşık 1 ay kaldım ve 1 aylık bu süreçte hem kendimi geliştirmeye çalışıyorum hem de düzenli olarak firmaları tarıyorum, tek tek özgeçmiş gönderiyorum. 300-400 firmaya özgeçmiş gönderdim desem herhalde abartmış olmam. Onlardan 20'si olumsuz dönüş yaptı, gerisi hiç dönmedi, 2'si ile mülakat sürecine girdik ve 1 tanesiyle anlaşabildim :)</span></span><br /></span></span></p><p><span><span><span><span><span> İş buldum ama gidip geldiğim mesafe yaklaşık 2 saat, bazen fazlası da var (Başakşehir-Maltepe), akşam eve vardığımda yemek yiyip sadece uyumaya fırsat bulabiliyordum, çünkü sabah 6 gibi yine kalkıp 4 metroya binerek işe gitmem gerekiyordu. Bu da yetmezmiş gibi, şirket Java ile geliştirdiğimiz projeyi dontet ile yazmaya karar verdi, benden memnun olduklarını, istersem dotnet ile devam edebileceğimi söylediler, kabul ettim ve kariyerimin belki de en zorlu ve en mutlu günlerini bir arada geçirdiğim bu dönemde oldu. Bu zorlukta da güzel bir nimet varmış (Tüm Delta ekibine sevgiler/saygılar.)...</span><br /></span></span></span></span></p><p><span><span><span><span><span><span> Orada uzun bir süre çalıştıktan sonra ailevi sebepler nedeniyle İzmir'e ailemin yanına dönüş yapabildim. Benim için birçok şey daha güzel gitmeye başladı, ama zorluklar hiç bitmez hayatta, bitmemeli de bence. Hayatın da güzelliği bunlarla mücadele etmekte ve bu süreçte düşsen de tekrar ayağa kalkabilmektedir. Yıllar geçti zaman geçiyor, nispeten tecrübeli de sayılırız ama zorluklar hiçbir zaman bitmiyor. Her dağın kendine göre karı var diye boşuna demiyorlar. Birçok tecrübe edinsek de kendimizi güçlü sansak da hayatta başarısız olmaya devam edebiliyoruz. Özellikle bizim sektörde her girdiğimiz işte tekrardan kendimizi kanıtlama ihtiyacı duyabiliyoruz, bu böyle de devam edecek galiba...</span></span></span></span></span></span></p><p><span><span><span><span><span><span><span> Belki de yazının başında söylemem gereken şeyi yazının sonuna bırakıyorum (başa alıp almama konusunda oldukça kararsız kaldım). Geri dönüş (retro/feedback) toplantılarının birinde, ekipten arkadaşlar yardım severlikten bahsedince, o an gözlerim doldu. Kendi yaşadığım zorlukları hatırlayınca, elimden geldiğince (ne kadar başarabiliyorum, bilmiyorum) özellikle genç arkadaşlarıma destek olmaya çalışıyorum. Kendi yaşadığım bazı zorlukları onlar yaşamasın diye naçizane mücadele ediyorum. Bu vesileyle geçmiş günlere bir atıfta bulunurken zorluklarla mücadele eden bizlere de bir ışık olmasını ümit ediyorum.</span><br /></span></span></span></span></span></span></p><p><span><span><span><span><span><span><span><span> Yazıyı Bakara Suresinden bir ayet-i kerimle bitirelim.</span><br /></span></span></span></span></span></span></span></p><p><span><span><span><span><span><span><span><span></span></span></span></span></span></span></span></span></p><blockquote>Andolsun, Biz sizi biraz korku, açlık ve bir parça mallardan, canlardan ve ürünlerden eksiltmekle imtihan edeceğiz. Sabır gösterenleri müjdele. (Bakara - 155)</blockquote><p></p>malik masishttp://www.blogger.com/profile/06624991798770591895noreply@blogger.com0tag:blogger.com,1999:blog-894742662176818755.post-58481724736476939092023-09-20T07:11:00.001-07:002023-09-20T07:11:55.299-07:00Mülakatlarda Teorik Performans mı Pratik Performans mı?<p> <span> S.A. Arkadaşlar,</span></p><p><span><span> Bir <a href="https://malikmasis.blogspot.com/2023/09/ekip-yonetmekten-korkuyor-musunuz.html" target="_blank">önceki yazımda</a> da son dönemlerde masanın diğer tarafında birçok mülakata girdiğimizi söylemiştim. Tabii aday olarak da birçok mülakata girdik, girmeye de devam edeceğiz gibi görünüyor. Özellikle teknik olan bu mülakatlara bir hazırlık yapıyor muyuz ya da yapmalı mıyız? Pratik kadar teorik de önemli oluyor mu yoksa yaptıklarımız yeterli, teorik bilgiye çok takılmasak da olur mu? Sizler de bu konuyu merak ediyorsan başlayalım<span></span></span></span></p><a name='more'></a><span> Öncelikle aday olarak girdiğim mülakat tecrübelerimden başlamak istiyorum. Kariyer hayatımızın başından beri farklı şirketlerin pek çok mülakatına giriyoruz. Ben bu konuda biraz daha fazla mülakata girmiş olabilirim, birsürü de olumlu olumsuz dönüşler aldık haliyle (Bunu farklı bir yazıda ele almayı düşünüyorum). Günün sonunda da bu mülakatlarda bir sürü tecrübe/edinim elde ediyoruz. Bu tecrübelerin kıymetini zaman içinde daha iyi anlayabiliyoruz.</span><br /><p></p><p><span><span><span> Girdiğimiz mülakatlarda karşı taraf tabii ki özgeçmişimize, yaptığımız işlere bakıyor. Fakat bunların ne kadarına hakimiz ve diğer konulardaki bilgilerimizi ölçmek için tabii farklı yöntemler uyguluyorlar. Bu yöntemleri beğensek de beğenmesek de her şirketin yoğurt yiyişi farklıdır. Bunun bir doğrusu yanlışı var mı çok da emin değilim açıkçası. Küçük proje verenler, büyük projede geliştirme yapmanızı isteyenler, birlikte kod yazanlar, yazılım tasarımı yaptıranlar, teknik sorular soranlar, genel tecrübe üzerinden gidenler diye liste uzar gider :)</span><br /></span></span></p><p><span><span><span><span> Ben kendi adıma her girdiğim şirketin mülakat sorularını not alırdım. Bunları hatırladığım ölçüde bir yere kaydederdim (hala birçoğu duruyor). Bunları araştırır eksik olan noktalarımı gidermeye özen gösterirdim ki bir sonraki mülakat daha iyi geçebilsin. Zamanla bu notlar çoğaldı ve bazı arkadaşlarımla da paylaştım, daha sonrasında internetten de örnek sorular bularak uzunca bir mülakat <a href="https://malikmasis.blogspot.com/2016/10/java-developer-mulakat.html" target="_blank">yazısı</a> yazdım, birkaç yıl sonra <a href="https://malikmasis.blogspot.com/2021/10/developer-mulakat-sorular-2.html" target="_blank">2'sini</a> yazdım şimdi de 3'sü taslak olarak duruyor açıkçası.</span><br /></span></span></span></p><p><span><span><span><span><span> Peki tüm bunlara değer miydi? Yani pratik olarak yıllarca tecrübe edinmiş olan bizlerin bir de bu tarz bilgileri öğrenmesi/ezberlemesi saçma değil mi? Kendi adıma saçma olmadığını söyleyebilirim, çünkü dilin/teknolojinin altyapısına dair çok şeyler öğrendim. Amacımız sadece bir şeyleri kodlamaksa eğer pratik bilgiler bize yetiyor, ancak bunların altını doldurmak da gerekiyorsa işte o zaman teorik altyapı da bir o kadar önemli hale geliyor. </span><br /></span></span></span></span></p><p><span><span><span><span><span><span> Şimdi tekrardan konuya dönecek olursak, bu tarz mülakatlara hazırlık yapmak neden önemlidir? Her ne kadar iyi yazılımcı da olsanız kendinizi ifade edebilmeniz, bildiğiniz şeylerin arkasını dolduruyor olmanız önemli olabiliyor. Bunu şirkete göstermek ve bu bilginin karşılığını maddi manevi almak o şirketteki kariyerinizi ciddi manada etkileyebiliyor. Yoksa belki sizden daha az bilgiye sahip ama kendini daha iyi ifade etmiş adaylar daha iyi şartlarda çalışabiliyor. Bu tarz durumlarda da iğneyi kendimize batırıp çuvaldızı da başkasına batırabiliriz.</span><br /></span></span></span></span></span></p><p><span><span><span><span><span><span><span> Mülakat performansınız çok iyi olması bazen de karşı tarafı fazla beklentiye sokuyor olabilir. Bunu iyi dengelemek gerekir, bu konuda da maalesef acı tecrübelerim var :) O yüzden başvurduğunuz pozisyonu, yapacağınız işi, alacağınız ücreti çok iyi göz önünde bulundurmakta fayda var.</span><br /></span></span></span></span></span></span></p><p><span><span><span><span><span><span><span><span> Bazen özgeçmişine göre mülakat performansı daha düşük adaylarla karşılaşıyoruz. Onlara sorduğumuz ilk soru: iş arayışına yeni mi başladınız? Bu sorunun cevabı ya evet oluyor ya da aday kendisi iş aktif olarak iş aramadığını kendisine ulaşıldığını söylüyor. Bir de uzun yıllardır aynı şirkette (legacy kodlarla boğuşan ya da kendini geliştirmeyi ihmal etmiş) çalışan adaylar da oluyor, onlarda da benzer mülakat problemleri yaşanabiliyor. </span></span></span></span></span></span></span></span></p><p><span><span><span><span><span><span><span><span><span> </span>Tüm bunları göz önünde bulundurduğumuzda sanıyorum ki mülakat performansının önemi ortaya çıkyıor. Sizler de farklı durumlardaki tecrübelerinizi aktarabilirsiniz, böylece hep birlikte güzel bir edinim sağlayabiliriz</span><br /></span></span></span></span></span></span></span></p><p><span><span><span><span><span><span><span><span><span> Yazıyı hikmetli güzel bir sözle bitirelim.</span></span></span></span></span></span></span></span></span></p><p><span><span><span><span><span><span><span><span><span></span></span></span></span></span></span></span></span></span></p><blockquote>"Nefsini/kendini bilen Rabbini bilir."</blockquote><p></p>malik masishttp://www.blogger.com/profile/06624991798770591895noreply@blogger.com0tag:blogger.com,1999:blog-894742662176818755.post-1341358392595746752023-09-19T04:03:00.001-07:002023-09-19T04:03:26.465-07:00Dönüşüm Hikayeleri 6 - Usta Yazılımcıyı Yaşlandıran O Sorun: Deadlock<p><span> S.A. Arkadaşlar,</span></p><p><span> Bir süredir yeni bir projeye başladığımız için legacy tarafındaki dönüşümümüz biraz yavaşladı. O yüzden bu serideki yazısı sıklığı eskiye göre azaldı. Tabii ki tek sebep bu da değil. Legacy olan kodu belirli bir olgunluğa da getirdik, fakat siz de takdir edersiniz ki hayat devam ediyor ve karşımıza her daim yeni problemler çıkacaktır. Bugün de CPU kullanımını tavan yapan bir probleme odaklanacağız. Hazırsanız başlayalım.</span></p><p><span></span></p><a name='more'></a><p></p><p><span> İyi yazılımcı debug yapar, daha iyi yazılımcı log okur sözünü her daim kullanırım. (Söz kime aitti maalesef hatırlamıyorum). Özellikle uç noktalarda log tutmanın ve onu okumanın faydaları çok daha kritik oluyor. Biz de log tarafına düşen kayıtlardan IoT tarafımızda bir problem olduğunu saptadık. Problem 20-30 istemci aynı anda geldiğinde CPU kullanımı fırlıyor ve tekrar eski haline gelmiyor. Buna sebep olan kodu bulduk, fakat bunun neresini düzeltmemiz gerekiyordu? </span><br /></p><p><span><span> Aşağıdaki yazılanlara bakmadan sizler de hızlıca koda bir göz gezdirip fikir yürütebilirsiniz. </span><br /></span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjJUKRu5UebFz7c0K-FVp-VHu_eI8qwAcz-gE_4g1m1uHA7gDHnv9vvH0tuX9oI-LVgme8QVe4gPbbMaeI8JRzEmMK0QD17E2Zqy5JOwu2qd-0OTEJ5chFxfcePQsqAaKOj1Z1RohdPc7QcU4niVVXiwgZ8OTCevqTdY4tjr8OU0zoLsgBCMaRHAzXEl2iA" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="217" data-original-width="512" height="272" src="https://blogger.googleusercontent.com/img/a/AVvXsEjJUKRu5UebFz7c0K-FVp-VHu_eI8qwAcz-gE_4g1m1uHA7gDHnv9vvH0tuX9oI-LVgme8QVe4gPbbMaeI8JRzEmMK0QD17E2Zqy5JOwu2qd-0OTEJ5chFxfcePQsqAaKOj1Z1RohdPc7QcU4niVVXiwgZ8OTCevqTdY4tjr8OU0zoLsgBCMaRHAzXEl2iA=w640-h272" width="640" /></a></div><p><span> </span><br /></p><p><span><span> Bu problemin sebebini ekip arkadaşlarımıza sorunca farklı farklı cevaplar geldi. Bu cevaplar benim ufkumu açtığı için buradan da biraz düzenleyerek paylaşmak istiyorum. Belki sizlerin de ilgisini çeker.</span><br /></span></p><p></p><ul style="text-align: left;"><li>TCP'de anlık bağlantı kontrol connected ile kontrol edilmez. Disconnect olunca dışarı atman lazım. Bu bağlantı kaybedildiğinde sonsuz döngüye girebilir. Nedenini tam bilmemekle beraber böyle olabileceğini düşünüyorum.<br /><br /></li><li>ReadAsync'nin işleyiş mantığından ötürü istemcinin düşüp düşmemesi önemli değil, istemci düşmüş ama ağ akışı düşmemiş olabileceği için hala işleme devam edip sonsuz döngüde kalabilir.<br /><br /></li><li>Client.Connected özelliği connection’ın o andaki bağlantı durumunu göstermiyor. Sadece en son mesaj operasyonunun sonucuna göre bağlantı durumunu belirtiyor. Yani sadece bir mesaj bile stream'den başarılı olarak okunsa ve bir daha stream'den hiç mesaj gelmese bile client.Connected hep <i>true</i> kalacak ve while koşulu sonsuz döngüye girecek. Bu da CPU’ya tavan yaptıracak.<br /><a href="https://learn.microsoft.com/en-us/dotnet/api/system.net.sockets.tcpclient.connected?view=net-7.0">https://learn.microsoft.com/en-us/dotnet/api/system.net.sockets.tcpclient.connected?view=net-7.0</a></li></ul><div><span> Problemin üzerinde çalışıp çözüme kavuşturan Selman ve Gökhan'ın yorumu/cevabı ise;</span><br /></div><p></p><p></p><p></p><ul style="text-align: left;"><li>Buradaki sorun aslında stream'in while dışında tanımlanmasıydı. stream dispose edildiğinde Connected false set ediliyor ancak dış scope'da tanımlandığı için bağlantı koptuğunda içerideki döngü bitiyor ve while(client.Connected) sonsuz dönmeye başlıyor. Stream de Dispose edilmediği için hep true oluyor. bir nevi <i>deadlock</i> oluyor. Stream tanımlaması while içine alındığında ise sorun çözülüyor. <br /><br /></li><li>Tabii bu sorunu çözse de while(client.Connected) kullanımı yine de gereksiz. Zaten Read metodu bağlantı koptuğunda -1 dönüyor. Bu vesileyle Dışarıdaki döngüye gerek kalmıyor.</li></ul><p></p><p><br /></p><p><span> Ekibin bu güzel çalışması için kendilerine teşekkür ederken, başlık için Emre'ye, yazmaya teşvik ettiği için de Selman'a ayrıca teşekkürlerimi sunar.</span><br /></p><p><span> Yazıyı bir ayet-i kerime ile bitirelim.</span><br /></p><p></p><blockquote><p>“Hiç kuşkusuz biz insanı zorluklarla mücadele etme gücüyle yarattık.” Beled, 90/4</p></blockquote>malik masishttp://www.blogger.com/profile/06624991798770591895noreply@blogger.com0tag:blogger.com,1999:blog-894742662176818755.post-43786845960351091792023-09-12T13:26:00.000-07:002023-11-26T06:54:24.160-08:00Ekip Yönetmekten Korkuyor Musunuz?<p> <span> S.A. Arkadaşlar,</span></p><p><span><span> Son dönemlerde masanın diğer tarafında yoğun bir şekilde mülakatlara giriyoruz. Güzel arkadaşlara denk geldikçe de muhabbet muhabbeti açıyor. Bugün görüştüğümüz bir arkadaş (kendisine selam olsun) çalıştığı yerde "takım lideri" pozisyonunda çalışıyor ve bu yüzden de işten ayrılmak istiyor. Gideceğim yerde yönetimsel işler ile değil sadece teknik konularla ilgilenmek istiyorum dedi. Ben de bir yerden sonra bundan kaçmanın çok da kolay olmadığını söyledim. Bu konuda sizler ne düşünüyorsunuz? <span></span></span></span></p><a name='more'></a><span> İyi bir yazılımcının her zaman iyi bir yönetici/lider olmayacağı ile ilgili daha önce acı birçok tecrübe yazısı okudum ve birçok şey dinledim. Özellikle bazı şirketlerin teknik olarak iyi olan yazılımcıları ekibin başına getirmeleri. Burada hem iyi bir teknik elemanı kaybediliyor hem de kötü bir yöneticileri oluyor. (Ben bunu futbolda şuna benzetiyorum, iyi futbolcular genelde iyi teknik direktör olmuyor, Zidane bunu alt üst etti bu arada :) ) Bu durumu gerçekten doğru bir şekilde yönetmek lazım. Teknik olarak daha az iyi olan arkadaşı yönetici veya lider yapmanın da sakıncaları olur mu ya da ne gibi sakıncaları olur, onu da iyi irdelemek lazım. Bu arada benim şahsi fikrim, bir grubun yöneticisi/lideri olmak hepsinden teknik olarak iyi olmayı gerektirmez. Tabii ki teknik olarak yeterince iyi olmalıdır, tek parametreyi teknik bilgi belirlemek bir hatadır. Çünkü insanı ilişkiler bu tarz işlerde en az teknik kadar önemlidir. Ayrıca bunun yanına birçok farklı parametre daha da eklenebilir...</span><br /><p></p><div><span><span> Yöneticilik/Liderlik kısmı biraz doğuştan gelen bir şey olsa da zamanla öğrenilen, hakkında kitaplar yazılan insanın kendini geliştirebildiği de bir alan. O yüzden ben bu konuda iyi değilim demek bir bahane olmamalı. Yaptığımız hiçbir şeyi doğuştan kazanmıyor bunun aksine bunun için birçok mücadeleler veriyoruz. Özellikle bizim gibi teknik insanların bu kadar ciddi öğrenmeye maruz kaldığı bir dönemde/pozisyonda...</span></span></div><div><span><span><span> </span><br /></span></span></div><div><span><span><span><span> Hepimizin kendini geliştirmesi önemli olduğu bir gerçek, fakat bir insanın bu konuları istememesi ve teknik taraflarda özellikle kalmak istemesi de çok doğal bir süreç, ama her şeye rağmen o kişiden biriken bilgi özellikle de bir şirkette uzun kalınıyorsa onu ister istemez değerli kılıyor. Bu bilgiyi tabii ki farklı şekillerde aktarmak da mümkün. Yani illa bir yönetici olmasına gerek yok, doğal bir lider olarak da bunu aktarabilir. (Bu konu iyi niyetli aktarmayı seven fakat teknik kısımda kalmak isteyen arkadaşları kapsıyor, aksi halini hiç düşünmüyoruz bile. Hızlı bir şekilde toksik kişilerden kurtulmak gerekir.)</span><br /></span></span></span></div><div><span><span><span><span><br /></span></span></span></span></div><div><span><span><span><span><span> Bu tarz pozisyonlardan kaçınmak bazen de bu pozisyonlar için birbirini harcayan insanlarla sizi çalışmak zorunda bırakabilir. Tabii ki iş değiştirmek veya o gibi yerlerde uzak durmak/kaçmak da bir seçenek olabilir, ama bunun da bir yıpratıcılığı olduğunu unutmamak lazım. Sizden teknik olarak daha zayıf biriyle çalışıyor olabilmeyi de kabullenmek lazım. Burada herkes özeleştirisini yapacaktır diye düşünüyorum.</span><br /></span></span></span></span></div><div><span><span><span><span><span><br /></span></span></span></span></span></div><div><span><span><span><span><span><span> Futbol oynamayı sevdiğim için genelde bu tarz konuları futbola da bağlarım, yukarıda da gördünüz zaten :) Kendi adıma genelde sivrilmeyi seven ya da becerebilen biri değilim. Bunu da kendimce çok hoş görmüyorum açıkçası (göze sokar şekilde yapılmasından bahsediyorum, yoksa kimi insanlar doğaları gereği sivrilebilmekte), ama sorumluluk almak gerektiğinde de bu sorumluluktan asla kaçmıyorum. Elimi taşın altına gücüm yettiğince sokmaya gayret ediyorum. </span><br /></span></span></span></span></span></div><div><span><span><span><span><span><span><br /></span></span></span></span></span></span></div><div><span><span><span><span><span><span><span> Bu tarz tecrübe yazıları bolca öznel kavramlar/yargılar içerir, bunun doğrusu yanlışı yoktur, farklı düşünenleri vardır. Bu yüzden farklı tecrübeleri hoş görmek lazım. Sizler de tecrübelerinizi paylaşırsanız memnuniyetle okumak isterim.</span><br /></span></span></span></span></span></span></div><div><span><span><span><span><span><span><span><br /></span></span></span></span></span></span></span></div><div><span><span><span><span><span><span><span> Yazıyı Kuran-ı Kerim'den kendime en çok örnek aldığım ayetlerden olan Saff suresinin <a href="https://kuran.diyanet.gov.tr/tefsir/Saff-suresi/5165/2-3-ayet-tefsiri" target="_blank">2. ve 3.</a> ayetleriyle bitirelim. </span></span></span></span></span></span></span></div><div><blockquote>Ey iman edenler! Niçin yapmayacağınız şeyleri söylüyorsunuz? Yapmayacağınız şeyleri söylemeniz Allah katında çok çirkin bir davranıştır.</blockquote></div><div><span><span><span><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8F4asab_tpe1V2VjMnC4A20-Nyjqd5mMhxB0mb7OzlUE7GcJJsadahF1f7Y3mTVIo3eegN4G3aYwYoTTYnNDwVHJQwJn_FfnZlSeyAUR_iphjBouTmkvh1IKa_GwdLWCm_OG4otTfUrDtKK9mJ57C2E6om-N3XVhAQQCds1vd-Wxi6yIAssHUoANN36HJ/s620/free-palestine-quds.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="620" data-original-width="600" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8F4asab_tpe1V2VjMnC4A20-Nyjqd5mMhxB0mb7OzlUE7GcJJsadahF1f7Y3mTVIo3eegN4G3aYwYoTTYnNDwVHJQwJn_FfnZlSeyAUR_iphjBouTmkvh1IKa_GwdLWCm_OG4otTfUrDtKK9mJ57C2E6om-N3XVhAQQCds1vd-Wxi6yIAssHUoANN36HJ/w620-h640/free-palestine-quds.jpg" width="620" /></a></div><br /><span><br /></span></span></span></span></div>malik masishttp://www.blogger.com/profile/06624991798770591895noreply@blogger.com0tag:blogger.com,1999:blog-894742662176818755.post-79436886482335387282023-08-18T15:34:00.001-07:002023-08-18T15:34:24.377-07:00Web Socket ve AWS ELB/ALB Problemi<p> S.A. Arkadaşlar,<br /> Bugün farklı sayılabilecek bir konu ile ilgili bazı notlarımızı paylaşmak istiyorum. Elektrikli şarj istasyonu projesini geliştirdiğimiz süreçte IoT ile yakından çalışma fırsatımız oldu. Cihaz ile <a href="https://en.wikipedia.org/wiki/WebSocket" target="_blank">web socket</a> üzerinden <a href="https://en.wikipedia.org/wiki/Open_Charge_Point_Protocol" target="_blank">OCPP</a> protokolü ile konuşuyorduk, fakat belirli aralıklarla socket tarafında kesinti olduğunu fark ettik, bunu nasıl çözdüğümüz ilginizi çekiyorsa buyurun başlayalım.</p><a name='more'></a> Fiziksel cihazlarla çalışmanın birçok zorluğu vardır. Bu zorluklarından bir tanesi de cihaz ile ilgili testler yaptığınızda cihazın yanında bulunmanız veya en azından ulaşacağınız birilerinin yanında olması gerekir. Biz de buradaki bağımlılığı minimize etmek için <a href="https://nodered.org/" target="_blank">node-red</a> kullanmaya karar verdik. Node-red en basit haliyle cihazı mock'luyor gibi düşünebilirsiniz (Aslında sanal bir istasyon görevi görüyor). Bizler fiziksel cihaza belirli komutlar gönderdiğimizde aldığımız cevapları node-red üzerinden işletiyoruz. Gerçek cihazın bize davrandığı gibi davranmasını sağlıyoruz. Bu da bizim cihaza olan bağımlılığımızı azaltıyor.<br /><p></p><p></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhuX4sFqMcwlbuvNcfFXT9iulyhx7USADeQdNozrHw-cmPHm4Rq3IMuz_1EON1aQl1ghcv80B7Hhbp7IFxo4trSNsei9yI6UtPMxtYa_0MSw90JfCQAtlUtfcnwBDaQYk09o74u00rnZELn69mk63wQq6IleFZOWMER7JAmedL0H5D-qBx7hsC__gJNd4Vo" style="margin-left: auto; margin-right: auto;"><img alt="" data-original-height="832" data-original-width="1258" height="424" src="https://blogger.googleusercontent.com/img/a/AVvXsEhuX4sFqMcwlbuvNcfFXT9iulyhx7USADeQdNozrHw-cmPHm4Rq3IMuz_1EON1aQl1ghcv80B7Hhbp7IFxo4trSNsei9yI6UtPMxtYa_0MSw90JfCQAtlUtfcnwBDaQYk09o74u00rnZELn69mk63wQq6IleFZOWMER7JAmedL0H5D-qBx7hsC__gJNd4Vo=w640-h424" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">https://github.com/node-red/node-red</td></tr></tbody></table><br /><p></p><p> Bizler node-red üzerinden gerekli ayarları yapıp akışı simüle etmeye çalıştığımızda yukarıda da belirttiğimiz gibi belirli aralıklarla bağlantının koptuğunu tespit ettik. Bildiğiniz üzere socket mantığına göre bağlantının kesilmemesi gerekiyor, fakat node-red üzerinde bir yerleri gözden kaçırmış olabiliriz diye üzerinde çok durmadık. Node-red'i yeniden başlatarak bu problemi geçici olarak çözüyorduk. Cihazla testlere başladığımız ise aynı problemle yeniden karşılaştık, burada da cihazı yeniden başlattığımızda problemin çözüldüğünü fark ediyorduk, fakat bu tabii ki gerçek hayatta bizim için çözüm olmayacaktı. </p><p><span> </span>Problemi çözmek için ekipçe toplandık. <a href="https://masstransit.io/" target="_blank">Masstransit</a> ile asenkron bir iletişim kurgulamıştık, problemin rabbitmq yüzünden olabileceğini düşündük, çünkü burada dönem dönem verilerin istenildiği gibi akmadığını fark ettik. Bunu managed olarak AWS üzerinden çalıştırmaya başladık, fakat maalesef bu da bizim için bir çözüm olmadı (aslında bir problemimizi çözmüştü ama asıl odaklandığımız problemi çözmedi). Bu arada bu sorunların local'de değil, sadece test ortamında olduğunu fark ettik. Bunun network yüzünden olabileceğinden şüphelendik. Diğer tüm projelerimizde olduğu gibi bu projemizde de <a href="https://aws.amazon.com/tr/elasticloadbalancing/" target="_blank">AWS ELB</a> (Elastic Load Balance) kullanıyorduk. Orada olmayan problem burada neden yaşanıyor olabilirdi dediğimizde ise diğer projeler <a href="https://aws.amazon.com/tr/what-is/restful-api/" target="_blank">REST API</a> iken bu projemizin ise socket projesi olduğu gerçeğini ve bunun probleme sebep olup olmayacağını araştırmaya karar verdik. Yaptığımız <a href="https://stackoverflow.com/a/39012803/1738819" target="_blank">araştırmalar</a> sonucu <a href="https://docs.aws.amazon.com/elasticloadbalancing/latest/application/introduction.html" target="_blank">AWS ALB</a> (Application Load Balance)'nin socket desteği olduğunu öğrenmiş olduk ve bu yöndeki değişiklikler platform ekibimiz tarafından tamamlandı. Ve tam da istediğimiz gibi oldu. Artık socket ile ilgili herhangi bir kopma vs gerçekleşmeden cihazımız ile sürekli olarak iletişim halinde kalabiliyorduk. Zor ve stresli bir süreci bu şekilde atlatarak rahatça bir nefes almış olduk.<br /></p><p><span> Yazıyı bir ayet-i kerime ile bitirelim.</span><br /></p><p><span style="color: #003366; font-family: EB Garamond;"></span></p><blockquote><span style="color: #003366; font-family: EB Garamond;">"Zorlukla beraber kolaylık vardır. Evet, zorlukla beraber kolaylık vardır." (İnşirah, 94/5-6)</span></blockquote><p></p><p><br /></p>malik masishttp://www.blogger.com/profile/06624991798770591895noreply@blogger.com0tag:blogger.com,1999:blog-894742662176818755.post-1640970454201323702023-08-18T14:31:00.004-07:002023-08-18T14:36:50.587-07:00Dotnet Tabanlı Mikroservis Projesine Go Servisi Eklemek <p><span> S.A. Arkadaşlar,<br /></span><span> Yaklaşık 1 yıl önce başladığım ve uzun süredir de yazmayı düşündüğüm bir konuyu erteleye erteleye şu an ancak yazabiliyorum. Bildiğiniz gibi üzerinde çalıştığım bir <a href="https://github.com/malikmasis/TelephoneDirectory" target="_blank">mikroservis</a> projem var. Orada 3 adet mikroservis vardı, buna ek olarak yeni bir mikroservis ekledim, fakat diğerlerinden farklı olarak bunu Golang ile kodladım. Bu nereden çıktı ve bu noktaya nasıl geldik diye bazı notlarımı paylaşmak istiyorum.<span></span></span></p><a name='more'></a><span> Aslını söylemek gerekirse en başından beri dotnet dışında bir dil ile bir servis implemente etmek istiyordum. Bunun go ile olmasının çok özel bir sebebi yok, dotnet dünyasında Golang'e olan ilgi benim de dikkatimi çekiyordu. Bora Kaşmer'in bir sunumunda da görmüştüm, daha sonra <a href="https://github.com/berkansasmaz" target="_blank">Berkan Şaşmaz</a> da birlikte çalıştığımız dönemde <a href="https://github.com/abpframework/eShopOnAbp" target="_blank">eShopOnAbp</a> projesine Golang ile bir servis geliştirmeyi hedefliyordu, bu iki örnek Golang ile yeni bir servis geliştirmeme vesile oldu.</span><br /><p></p><p> İnsanın hedefleri olması güzel, ben de bu hedef doğrultusunda kodlamaya başlamalıydım, fakat Golang adına pek bir bilgim yoktu. Projeyi genel olarak incelediğinizde iş katmanı olarak oldukça sade, bunun sebebi benim bu projeyi öğrenme amacıyla kullanmam. Burada da Golang ile sadece 2 uç ve bir adet log atmıştım. İlk amacım yeni servisi, mikroservis projesi dahilinde ayağa kaldırmaktı. Projeyi çalıştırabilirsem sonraki aşamalara geçmeyi düşünüyordum. İyi ki böyle düşünmüşüm çünkü bu bile beni gerçek anlamda çok zorlamıştı. Özellikle <a href="https://docs.docker.com/language/golang/build-images/" target="_blank">docker konfigürasyonu</a> (docker container içerisinde "curl" komutunu tanımlayamama gibi bir problem yaşarsanız <a href="https://stackoverflow.com/questions/34571711/cant-run-curl-command-inside-my-docker-container" target="_blank">buraya</a> göz atabilirsiniz) ve bunu <a href="https://github.com/malikmasis/TelephoneDirectory/blob/main/src/Global/Gateway.WebApi/OcelotConfiguration/ocelot.examplego.json" target="_blank">gateway</a> ile birlikte ayağa kaldırmak zor olmuştu. Bu konuda kendisini daha önce tanımıyor olmama rağmen yardımcı olan <a href="https://github.com/alnck" target="_blank">Eren Alincak</a> ve DevOps konularında bana birçok kez yardımı dokunan <a href="https://github.com/akiffeyzioglu" target="_blank">Akif Feyzioğlu</a>'na teşekkürler.<br /></p><p><span><span> Projeyi development ortamında ayağa kaldırmak için Tye kullanıyorum. (Tye neden kullandığımı merak ediyorsanız <a href="https://medium.com/software-development-turkey/deneysel-bir-%C3%BCr%C3%BCn-project-tye-768e335527d2" target="_blank">buradaki yazıya</a> bakabilirsiniz.) Tye maalesef Golang servisi ayağa kaldırmayı desteklemiyor. Onun için maalesef bazı yan yollara saparak .bat dosyaları oluşturarak Golang servisi local'de de tek bir yerden ayağa kaldırmayı başardık. Diğer taraftan zaten docker ile konfigürasyonu tamamladığımız için orayı zaten halletmiştik.<br /></span></span></p><p><span> Basit anlamda ayarlamaları tamamladıktan sonra servislerin birbiriyle nasıl konuşacağına sıra geldi. O dönemde Dapr ile haşir neşir olmuştum. Dapr'in hem dotnet hem golang hem de başka birçok dil desteği mevcut. (Ayrıntılı bakmak isteyenler <a href="https://medium.com/software-development-turkey/dapr-ile-ba%C4%9F%C4%B1ms%C4%B1z-servisler-3b3882e58bca" target="_blank">bu yazıma</a> göz atabilir). Ben de dotnet üzerinden atılan event'i go ile yakalamaya karar verdim. Bu vesileyle dotnet tarafına örnek <a href="https://github.com/malikmasis/TelephoneDirectory/blob/bae1fa979d272d37a8b031cb89129d748b84d274/src/Microservices/Csharp/Guide/TelephoneDirectory.Guide/Controllers/GuideController.cs#L200" target="_blank">bir uç</a> ekledim, buradan gelen bilgiye göre golang servisi sms ve eposta gönderecek şekilde düzenledim. Yine o dönemlerde <a href="https://www.twilio.com/blog/send-sms-30-seconds-golang" target="_blank">Twillio</a> <span id="docs-internal-guid-8069c2c1-7fff-b7e6-04f3-d12909ed29b8"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">implementasyonu</span></span> yapmıştım dotnet tarafında, bu sefer burada oluşan tecrübeyi go tarafına aktardım. (sistem değişkenlerine set etme ile ilgili bir hata alırsanız <a href="https://www.twilio.com/blog/2017/01/how-to-set-environment-variables.html" target="_blank">buraya</a> göz atmanızı tavsiye ederim.) İsmi hala "example" olarak da kalsa yeni servisi, bildirim servisi olarak düşünebiliriz.<br /></span></p><p><span><span><span> Bu yazının gecikmesinin en büyük nedenlerinden biri aslında golang tarafına if ile yapılan sms mi <a href="https://www.loginradius.com/blog/engineering/sending-emails-with-golang/#:~:text=Below%20is%20the%20complete%20code,%2C%20%7D%20%2F%2F%20smtp%20server%20configuration." target="_blank">eposta</a> mi gönderimi için "builder pattern" kullanmayı düşünmemdi, aklımda olsa da maalesef hala başlayamadım. Diğer bir sebebi bu projeye unit test de eklemek istiyordum. Şu an bu taraftaki aklıma ilk gelen eksiklikler bu şekilde. Belki bunları da zamanla geliştirme fırsatı yakalarım. Ya da sizlerden PR gelebilir :)<br /></span></span></span></p><p><span><span><span> Burada çok önceden kapatılmış <a href="https://github.com/malikmasis/TelephoneDirectory/pull/6" target="_blank">PR</a> var. Bu ilk eklenen hali. İlk geliştirmeleri görmek isteyen olabilir diye paylaşmak istedim. Sadece son committe proje yapısını tamamen değiştirdiğim(eski yapı microservice klasörü altında servisler var iken yeni değişiklik ile Csharp ve Golang adında 2 klasör daha ekledim) değişiklikler fazla gözüküyor, son commit dışındakileri inceleyebilirsiniz. Son güncel halini incelemek isterseniz <a href="https://github.com/malikmasis/TelephoneDirectory/tree/main/src/Microservices/Golang/Example" target="_blank">buraya</a> göz atabilirisiniz.<br /></span></span></span></p><p></p><div class="separator" style="clear: both; text-align: center;"><span> </span><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDCMPpJ-VLulLsYkYDmfIqUIyDdq-Vm9Ux5nmEWttXsgoBdWzz4bX93lGNQrCMtMu1hr_QV_leBMRPFIAcsMKvkUf0LOvexZA4mNk9SQ8phDxA9R2ynvQTNe_IEPIY_5ItcjTudKqyn-iESEILBAM-fXugQNd9ZPTdzzyetLBH66NC1WefcqFWEGt7iBCI/s510/Screenshot%202023-08-16%20at%2000.07.11.png" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="304" data-original-width="510" height="239" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDCMPpJ-VLulLsYkYDmfIqUIyDdq-Vm9Ux5nmEWttXsgoBdWzz4bX93lGNQrCMtMu1hr_QV_leBMRPFIAcsMKvkUf0LOvexZA4mNk9SQ8phDxA9R2ynvQTNe_IEPIY_5ItcjTudKqyn-iESEILBAM-fXugQNd9ZPTdzzyetLBH66NC1WefcqFWEGt7iBCI/w400-h239/Screenshot%202023-08-16%20at%2000.07.11.png" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Projenin yeni hali<br /></td></tr></tbody></table></div><p></p><p><span><span> Genelini dotnet ile geliştirmiş olduğum projeye yeni bir golang servisi ekleme serüvenimi aklımda kaldığı kadarıyla paylaşmaya çalıştım. Bu konudaki geri dönüşlerinizi duymaktan mutluluk duyarım.</span></span></p><p><span><span> Yazıyı bir hadis-i şerif ile bitirelim.</span></span></p><p><span></span></p><blockquote><p><i><span> "</span>Arab’ın Acem’e, Acem’in Arab’a üstünlüğü olmadığı gibi, kırmızının karaya, karanın kırmızıya da üstünlüğü yoktur. Hiçbir milletin diğerine üstünlüğü yoktur. Üstünlük ancak takvâ iledir."</i></p><p> [İbni Neccar] (Acem, Arap olmayan demektir.)</p></blockquote><p></p>malik masishttp://www.blogger.com/profile/06624991798770591895noreply@blogger.com0tag:blogger.com,1999:blog-894742662176818755.post-37010236036080104282023-06-21T04:39:00.001-07:002024-02-25T11:57:40.237-08:00Bir Refactoring Hikayesi: Class vs Record vs Struct<p> <span> S.A. Arkadaşlar,</span></p><p><span> Bugün, yazdığım bir parça kodun gelişim hikayesinden bahsetmek istiyorum. Hediye kodu tanımlama ile ilgili bir iş üzerinde çalışmam gerekti. Benzersiz hediye kodları üretip bunları veri tabanına yazmam gerekiyordu. Kodun ilk hali her oluşturulan kod için veri tabanına gidip kontrol edip eğer aynı kayıt yok ise bunu kaydediyordu. Bu belki de en yavaş çözüm olabilirdi. Biz bu kod parçasını geliştirmeye çalıştık. Hazırsak başlayalım.<span></span></span></p><a name='more'></a><span> Birçoğumuzun aklına ilk gelen çözüm tabii ki bu işlemi toplu olarak kaydetmek gelir herhalde. Benim de aklıma gelen oydu. İlk öncelikle oluşturduğum kodları kontrol edip daha sonra kayıt işlemini tamamlıyordum. Bu yazı için odaklandığım kısım ise kodları oluşturduktan sonra listeye eklediğim kısım. Bu listeyi alıp dapper aracılığıyla belirli parçalara bölüp kaydediyorum. (Kodu ilk başta 2 metoddan yazmak yeterli olacak diye düşünürken yazı ilerledikçe kapsam genişledi. Bu yüzden kodun tamamını <a href="https://github.com/malikmasis/Class-Record-Struct-Benchmark" target="_blank">buraya</a> taşıdım.)</span><br /><p></p><div style="background-color: white; color: #202020; font-family: "JetBrains Mono", monospace;"><pre style="font-size: 9.8pt;"><span style="color: #0f54d6;">var </span><span style="color: #383838;">giftCodeList = </span><span style="color: #0f54d6;">new </span><span style="color: #6b2fba;">List</span><span style="color: #383838;"><</span>GiftCodeClass<span style="color: #383838;">>();<br /></span><span style="color: #383838;"><br /></span><span style="color: #0f54d6;">for </span><span style="color: #383838;">(</span><span style="color: #0f54d6;">var </span><span style="color: #383838;">i = </span><span style="color: #ab2f6b;">0</span><span style="color: #383838;">; i < </span>giftCodes<span style="color: #383838;">.</span>Count<span style="color: #383838;">; i++)<br /></span><span style="color: #383838;">{<br /></span><span style="color: #383838;"> giftCodeList.</span><span style="color: #00855f;">Add</span><span style="color: #383838;">(</span><span style="color: #0f54d6;">new </span>GiftCodeClass<br /> <span style="color: #383838;">{<br /></span><span style="color: #383838;"> </span>Code <span style="color: #383838;">= </span>giftCodes<span style="color: #383838;">.</span>ElementAt<span style="color: #383838;">(i),<br /></span><span style="color: #383838;"> </span>Amount <span style="color: #383838;">= </span><span style="color: #ab2f6b;">50</span><span style="color: #383838;">,<br /></span><span style="color: #383838;"> </span>Desc <span style="color: #383838;">= </span><span style="color: #8c6c41;">"Aciklama"</span><span style="color: #383838;">,<br /></span><span style="color: #383838;"> </span>Partner <span style="color: #383838;">= </span><span style="color: #8c6c41;">"Partner"</span><span style="color: #383838;">,<br /></span><span style="color: #383838;"> </span>StartDate <span style="color: #383838;">= </span><span style="color: #300073;">DateTime</span><span style="color: #383838;">.</span><span style="color: #0093a1;">UtcNow</span><span style="color: #383838;">,<br /></span><span style="color: #383838;"> </span>EndDate <span style="color: #383838;">= </span><span style="color: #300073;">DateTime</span><span style="color: #383838;">.</span><span style="color: #0093a1;">UtcNow</span><span style="color: #383838;">.</span><span style="color: #00855f;">AddYears</span><span style="color: #383838;">(</span><span style="color: #ab2f6b;">1</span><span style="color: #383838;">),<br /></span><span style="color: #383838;"> </span>CreatorId <span style="color: #383838;">= </span><span style="color: #ab2f6b;">1<br /></span><span style="color: #ab2f6b;"> </span><span style="color: #383838;">});<br /></span><span style="color: #383838;">}</span></pre><pre style="font-size: 9.8pt;"><br /></pre><p style="text-align: left;"><span style="color: black; font-family: Times; white-space: normal;"><span> </span>Yukarıdaki kodda giftCodes (proje içerisinde bu değişken HashSet olarak tanımlandı, çünkü eklenen kodların benzersiz olmasını amaçlıyorduk) içerisinde 1 milyon kod olan bir liste olarak düşünebilirsiniz. Bir sınıf oluşturuyorum ve bunu sırasıyla koleksiyona ekliyorum. Daha sonra sınıf kullanımı yerine "record" yapısını kullanabileceğimi düşündüm. Kodu aynı bırakmak kaydıyla sınıfı record olarak değiştirdim. Fark ettiniz mi bilmiyorum ama kod hariç diğer değişkenler değişmiyor (gerçekte de öyleydi). Bu yüzden burada record ile birlikte kullanılan "with" anahtar kelimesini kullanabileceğimi düşündüm ve kodu aşağıdaki gibi değiştirdim. Yani ilk etapta elimizde ölçüme hazır 3 parça kod bulunuyordu.</span></p><div style="font-size: 9.8pt;"><pre><span style="color: #0f54d6;">var </span><span style="color: #383838;">giftCode = </span><span style="color: #0f54d6;">new </span>GiftCodeRecord<br /><span style="color: #383838;">{<br /></span><span style="color: #383838;"> </span>Amount <span style="color: #383838;">= </span><span style="color: #ab2f6b;">50</span><span style="color: #383838;">,<br /></span><span style="color: #383838;"> </span>Desc <span style="color: #383838;">= </span><span style="color: #8c6c41;">"Aciklama"</span><span style="color: #383838;">,<br /></span><span style="color: #383838;"> </span>Partner <span style="color: #383838;">= </span><span style="color: #8c6c41;">"Partner"</span><span style="color: #383838;">,<br /></span><span style="color: #383838;"> </span>StartDate <span style="color: #383838;">= </span><span style="color: #300073;">DateTime</span><span style="color: #383838;">.</span><span style="color: #0093a1;">UtcNow</span><span style="color: #383838;">,<br /></span><span style="color: #383838;"> </span>EndDate <span style="color: #383838;">= </span><span style="color: #300073;">DateTime</span><span style="color: #383838;">.</span><span style="color: #0093a1;">UtcNow</span><span style="color: #383838;">.</span><span style="color: #00855f;">AddYears</span><span style="color: #383838;">(</span><span style="color: #ab2f6b;">1</span><span style="color: #383838;">),<br /></span><span style="color: #383838;"> </span>CreatorId <span style="color: #383838;">= </span><span style="color: #ab2f6b;">1<br /></span><span style="color: #383838;">};<br /></span><span style="color: #383838;"><br /></span><span style="color: #0f54d6;">var </span><span style="color: #383838;">giftCodeList = </span><span style="color: #0f54d6;">new </span><span style="color: #6b2fba;">List</span><span style="color: #383838;"><</span>GiftCodeRecord<span style="color: #383838;">>();<br /></span><span style="color: #383838;"><br /></span><span style="color: #0f54d6;">for </span><span style="color: #383838;">(</span><span style="color: #0f54d6;">var </span><span style="color: #383838;">i = </span><span style="color: #ab2f6b;">0</span><span style="color: #383838;">; i < </span>giftCodes<span style="color: #383838;">.</span>Count<span style="color: #383838;">; i++)<br /></span><span style="color: #383838;">{<br /></span><span style="color: #383838;"> giftCodeList.</span><span style="color: #00855f;">Add</span><span style="color: #383838;">(giftCode </span><span style="color: #0f54d6;">with </span><span style="color: #383838;">{ </span>Code <span style="color: #383838;">= </span>giftCodes<span style="color: #383838;">.</span>ElementAt<span style="color: #383838;">(i) });<br /></span></pre></div><pre style="font-size: 9.8pt;">}<span style="color: black; font-family: Times; font-size: medium; white-space: normal;"> </span></pre></div><p><span><span> </span>Sizce de buradaki kod daha iyi değil mi? Hepimizin bildiği üzere yeni bir nesne oluşturmak oldukça maliyetli bir iş. Yukarıdaki örnekte listenin her elemanı için bir nesne oluşturup bütün değerlerini teker teker atıyorduk. Son örneğimizde ise bir tane nesne oluşturuyoruz. Daha sonra bunu her defa yapmak yerine "with" anahtar sözcüğü ile sadece değiştirmek istediğimiz alan olan kodu değiştiriyoruz ve bunu listeye ekliyoruz (shallow copy). Buraya kadar her şey güzeldi, fakat b</span><span>u yazıyı yazmaya başladıktan sonra biraz araştırmalar neticesinde farklı seçenekler de karşımıza çıktı. C# 10 ile gelen "record struct" ve daha önceden beri var olan "struct" yapısını da eklemeye karar verdik. Ayrıca bunların "with" anahtar kelimesi ile birlikte kullanımlarını da ele aldık. Böyle 3 metod olan kodumuz 6 metoda çıkmış oldu. </span></p><p><span> <a href="https://github.com/dotnet/BenchmarkDotNet" target="_blank">Benchmark</a> kütüphanesi ile aşağıdaki gibi bir çıktı aldık.<br /></span></p><div class="separator" style="clear: both; text-align: center;"><br /><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhAZGLdmmULgFIXAxJZjs1MkOf6qDO2ARqX1aYjfInBd8tIdsSH7elhiRCg8r0NAa9S6DqGoTtIsPEx1ZSOe4Aml1vYU75U6_R0FJZgWW2b2LMQ112UDO1Rw51pAR3oWKEfs1X_CZS7Tr1YH9LqvTGqohYWf82ii4-IHDoXwneNOZa2A7JLCUEBesyUs77z" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="448" data-original-width="1834" height="156" src="https://blogger.googleusercontent.com/img/a/AVvXsEhAZGLdmmULgFIXAxJZjs1MkOf6qDO2ARqX1aYjfInBd8tIdsSH7elhiRCg8r0NAa9S6DqGoTtIsPEx1ZSOe4Aml1vYU75U6_R0FJZgWW2b2LMQ112UDO1Rw51pAR3oWKEfs1X_CZS7Tr1YH9LqvTGqohYWf82ii4-IHDoXwneNOZa2A7JLCUEBesyUs77z=w640-h156" width="640" /></a></div></div><br /></div><span> Yukarıdaki tabloyu biraz inceleyecek olursak "record" ile "class" yapılarındaki değerlerin birbirine çok yakın olduğunu göreceksiniz. Hatta bazı metriklerde aynı olduğunu fark etmişsinizdir. C# kodu decompile olduğunda "record" aslında "class" yapısına dönüşmektedir. Burada belki belirtmemiz gereken nokta "record" yapılar immutable (değişmez) yapılar iken, "class"lar ise mutable (değişir) yapılardır. "Class"lar için benzer değişiklikler yapılarak değişilmez hale getirebileceğimizi de belirtelim.</span><div>Aşağıdaki ekran çıktısını inceleyebilirsiniz.<br /><div><br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjhrRJ8SMWCTeBByUVa4RvYV7MB4LpLbsnvGDmIlaBtalAcLbCbtDM4W5Ok6VQTemLeB8Ne6axiDlnl3gzaAnLF_bSOo8307BDK5lN_rBZGsEZDaJR4vMqWg02qEozkjmg1ni9qRBZfjFL53EqFMGL_Ep9I-OlvqsZ5AreA6DXok00yM0Dm2kVLbzg17IKx" style="margin-left: auto; margin-right: auto;"><img alt="" data-original-height="465" data-original-width="1000" height="298" src="https://blogger.googleusercontent.com/img/a/AVvXsEjhrRJ8SMWCTeBByUVa4RvYV7MB4LpLbsnvGDmIlaBtalAcLbCbtDM4W5Ok6VQTemLeB8Ne6axiDlnl3gzaAnLF_bSOo8307BDK5lN_rBZGsEZDaJR4vMqWg02qEozkjmg1ni9qRBZfjFL53EqFMGL_Ep9I-OlvqsZ5AreA6DXok00yM0Dm2kVLbzg17IKx=w640-h298" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;"><a href="https://josipmisko.com/posts/c-sharp-class-vs-record">https://josipmisko.com/posts/c-sharp-class-vs-record</a></td></tr></tbody></table><br /> Şimdi başka bir nokta ise "record" ile "with" anahtar kelimesinin birlikte kullanılması sonucu ortaya çıkan farklılık. "with" anahtar kelimesi "shallow copy" yani sığ kopyalama yapıyor, yani nesne olmayan değişkenleri (primative) alarak yeni bir nesne oluşturarak kayda değer bir performans farkı oluşturuyor. (Karmaşık yani nesne içeren işlemlerde bunu kullanamazsanız, bunu yapmak isterseniz "deep copy" yapmanız gerekecektir. Aradaki fark için hızlıca <a href="https://www.geeksforgeeks.org/difference-between-shallow-and-deep-copy-of-a-class/" target="_blank">şuraya</a> göz atabilirsiniz.)<br /><p></p><p><span> Şimdi ise yine C# 10 ile gelen başka bir özellik olan "record struct" yapısı ile daha önceden beri gelen ama yüzüne çok da bakılmayan "struct" yapılarına bir göz atalım. Bu iki yapının bazı metriklerinin "class" ve "record"lardaki gibi çok benzer veya aynı olduğunu görüyorsunuz. Burada da benzer bir decompile işlem olabileceğini düşünüyorum. "record", "struct" ve "class" arasında doğru kullanımda "struct" yapısının nasıl fark oluşturduğunu rahatlıkla görebiliyoruz. O yüzden ezberlerimizden kurtulup nerede ne kullanmamız gerektiğine dikkat edersek çok daha performanslı yapılar kurgulayabiliriz. "struct" yapısının diğerlerinden daha hızlı çalışmasının sebebi ise bellekte saklandığı yer. Bildiğiniz gibi "value type" olan yapılar "stack"da saklanır ve bu vesileyle yok edilmek için GC'a da ihtiyaç duymazlar.</span><br /></p><p><span><span> Son olarak ise "record struct" ve "struct" yapılarının gücünü "with" anahtar sözcüğü ile birleştirelim. (bu anahtar kelime "struct" ile de kullanıldığını hatırlatalım). Burada "with" anahtar kelimesi başlı başına öne çıkmayı başarmıştı ve burada birlikte kullanılması ile performansını daha da öne çekmektedir. </span><br /></span></p><p><span> Bu arada benim karşılaştırdığım durumlar yeni bir nesne oluşturmasıyla ilgili metrikler. Farklı metriklerde farklı sonuçlar alabilirsiniz. Bu araştırmaları yaparken farklı durumları karşılaştıran şu <a href="https://www.c-sharpcorner.com/article/everything-you-want-to-know-about-the-record-type-in-net-performance/" target="_blank">yazıya</a> da göz atmak isteyebilirsiniz.</span></p><p><span><span> Yazıyı bitirmeden bazı notlar paylaşmak istiyorum. Özetle</span></span></p><p></p><ul style="text-align: left;"><li><span><span> "record" yapısı varsayılan olarak değişilmez değildir. Onu değişilmez yapmak isterseniz ya "init" anahtar kelimesini kullanmanız gerekir veya başlangıçta constructor ile birlikte kullanmalısınız.</span></span></li><li><span><span> "record" yapısını C# 10 ile birlikte "class" ve "struct" için ayrı ayrı düşünebilirsiniz. Hatta C# 10 "record class" kullanımına da müsade ediyor. Varsayılan olarak bahsedilen ise "class" olan yapıdır. </span></span></li><li><span><span>"record" ve "class" referans bazlı olmasına rağmen, "struct" değer bazlıdır. Referans bazlı olanlar "Heap"te, değer bazlı olanlar ise "Stack" saklanır.</span></span></li><li><span><span>"record" ve "class" sanki sürekli aynıymış gibi bahsetmemize rağmen "record" ve "struct" yapılarında karşılaştırma yaparken nesnenin değerine bakarken, "class"larda ise nesnenin referansının aynı olup olmadığına bakılır.</span></span></li><li><span>Değişmez, değişir kavramından çok bahsettik. Değişmez neslerin bazı avantajları: "thread safe" olmaları, yan etkilerinin az olması ve optimize edilebilirler olmaları iken dezavantajları ise öğrenme eğrileri ve bellek sorunu olarak belirtilebilir. (<a href="https://blog.ndepend.com/c9-records-immutable-classes/" target="_blank">dahası</a>)</span></li><li><span>Nerede hangisini kullanacağınıza kabaca bakacak olursak, değer bazlı bir yapı var ise "struct", değişmez olmasını istediğiniz yapılar var ise "record" (DTO, Even vs) ve diğer kalan durumlar için "class" tercih edebilirsiniz. (<a href="https://stackoverflow.com/a/64828780/1738819" target="_blank">dahası</a>)</span></li></ul><p></p><div><p><br /></p><p></p><blockquote> <b>Konu dışı</b>: </blockquote><blockquote><span> </span>Bazen yazı yazmanın size ne gibi faydası oluyor diye soran arkadaşlar oluyor. Bu yazı öğrenmenin en somut göstergelerinden biriydi benim için. Yazıyı yazmadan önce aklımda olan şeyler ile yazıyı yazmaya başladıktan sonra araştırdığım nokta arasında büyük bir fark var. Yazıya başlamadan önce 2-3 saatte aklımdakileri yazar, bitiririm derken bu yazıyı yaklaşık 1 haftada (belirli aralıklarla) birçok farklı yazı, metric ve kodu denemeleri sonucu ele alabiliyorum.</blockquote><p> </p><p></p><p><span> </span><span> Yazıyı, konu dışında da bahsettiğimiz gibi, bildiklerini aktarmanın öneminden bahseden bir hadisi şerif ile bitirelim. </span></p><blockquote>Sevgili Peygamberimiz(s.a.v), “<i>Sadakanın en faziletlisi bir Müslüman’ın, öğrendiklerini Müslüman kardeşine öğretmesidir</i>” buyurur. <span face="Arial, Verdana, sans-serif" style="background-color: white; color: #32302c; font-size: 14px; text-align: justify;"> </span><span face="Arial, Verdana, sans-serif" style="background-color: white; color: #32302c; font-size: 14px; text-align: justify;">İbn Mâce, Sünnet, 20.</span></blockquote><p> </p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixeYgxWI_0qd8VL46Ev35bhin75lSTqYpyd8MzipGdkd13cP9NT9Uc7CSISpkV8yPxg7anb1l8kbKev3hpnzC9BeBO4G5pGsCJsHlife1kvukNFtXNDRUAEeguQqloXlSt70VPt14kQni48B4kcZetss2ByYDVLYWhZoEVEVDn2AamnqjiYo89836fxXpI/s620/free-palestine-quds-vector-illustration-600w-1970687537.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="620" data-original-width="600" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixeYgxWI_0qd8VL46Ev35bhin75lSTqYpyd8MzipGdkd13cP9NT9Uc7CSISpkV8yPxg7anb1l8kbKev3hpnzC9BeBO4G5pGsCJsHlife1kvukNFtXNDRUAEeguQqloXlSt70VPt14kQni48B4kcZetss2ByYDVLYWhZoEVEVDn2AamnqjiYo89836fxXpI/w620-h640/free-palestine-quds-vector-illustration-600w-1970687537.jpg" width="620" /></a></div><br /><p></p><p></p></div></div></div>malik masishttp://www.blogger.com/profile/06624991798770591895noreply@blogger.com0tag:blogger.com,1999:blog-894742662176818755.post-44905274514141757152023-06-17T06:16:00.002-07:002023-06-17T06:26:45.289-07:00OpenTelemetry<p> <span> S.A. Arkadaşlar,</span></p><p><span><span><span> </span></span></span>Bildiğiniz gibi mikroservis yapıları bazı zorlukları da beraberinde getiriyor. Bunlardan biri de logları, metrisleri kaydetmek, izlemek ve onları merkezi bir yapı haline getirmektir. OpenTelemetry, bu zorlukları kolaylaştırmak için açık kaynaklı bir projedir. Yeni bir proje olmasına rağmen iyi bir yapıya dayanıyor. Çok çeşitli SDK'ları ve 3. parti kütüphaneleri desteklemektedir. Tüm bu konuları ele alacağımız bir yazıya hazırsak başlayalım. </p><p><span></span></p><a name='more'></a> <span> OpenTelemetry temel olarak 3 konuyu ele alır. Bunlar log kayıtları (logging), takip süreci (tracing) ve metrikler (metrics). Bu 3 konuyu ayrı ayrı ele alacağız. Kodlarla destekleyip en son da unit testlerini yazarak yazıyı sonlandırmayı düşünüyoruz. Her zamanki gibi kodları örnek projemizde yapmakla birlikte, bu konuya ait örnekleri ayrıntılı olarak bu <a href="https://github.com/malikmasis/TelephoneDirectory/pull/26" target="_blank">PR</a>'da görebilirsiniz.</span><p></p><p><span><span> Birden çok sdk'sı mevcut demiştik. C++, .Net, Java, Golang, Python bunlardan bazılarıdır. Dotnet tarafında desteklediği 3.parti kütüphanelerden bazıları ise SqlClient, Grdp, Http, Zepkin, Jaeger, Prometheus'dir.</span><br /></span></p><p><span><span><span> Dotnet tarafında yapılan kodlamalar genel olarak Microsoft'un kendi yapıları üzerine inşa edilmiştir. Bunları daha derli toplu ele alır ve yukarıda bahsettiğimiz yapılar için hazır hale getirir. Birçok özelliği bizim için soyutlayarak kullanıma hazır hale getirir. Normal koşullarda servislerden tek tek bu verileri ele alarak halledebiliriz, fakat OpenTelemeetry tüm bunların merkezine geçerek bu işi bizim yerimize halleder.</span></span></span></p><p><span><span><span><span> Kod kısmına geçmeden önce belirtmemiz gereken bazı</span></span></span></span> önemli noktalara hatırlatma yapmamız lazım. Yukarıda da bahsedildiği gibi, bu yeni bir proje ve hala sıkı bir şekilde geliştiriliyor ve önemli değişiklikler içeriyor, bu nedenle farklı kod örnekleriyle karşılaşabilirsiniz. İnternetteki kaynaklarda nispeten biraz eski olan yazılarda deprected(son sürümlerde silinecek kodlar) olmuş kod örnekleri var. Farklı şekildeki ayarlar kafanızı karıştırmasın. Örneğin <a href="https://www.meziantou.net/monitoring-a-dotnet-application-using-opentelemetry.htm#configuring-the-appl-6ad37b" target="_blank">şuradaki</a> yazı çok kaliteli ve güzel olmasına rağmen (2021 yazısı) ayarları eskidir. Ayrıca paketinde bir çok RC ve beta versiyonu bulunmakta ve hangisini kullanmanız gerektiğini kafanızı karıştırabilmektedir. Bu durumda, tüm yapılandırmalar için aynı sürümleri kullanmayı deneyebilirsiniz.<br /></p><div style="background-color: #262626; color: #d0d0d0; font-family: "JetBrains Mono", monospace; font-size: 9.8pt;"><pre><span style="color: #85c46c; font-style: italic;">//deprected code<br /></span><span style="color: #c191ff;">services</span><span style="color: #bdbdbd;">.</span>AddOpenTelemetryTracing<span style="color: #bdbdbd;">(builder </span>=><br /><span style="color: #bdbdbd;">{<br /></span><span style="color: #bdbdbd;">}<br /></span><span style="color: #c191ff;">services</span><span style="color: #bdbdbd;">.</span>AddOpenTelemetryMetrics<span style="color: #bdbdbd;">(builder </span>=><br /><span style="color: #bdbdbd;">{<br /></span><span style="color: #bdbdbd;">}<br /></span><span style="color: #85c46c; font-style: italic;">//latest code<br /></span><span style="color: #c191ff;">services</span><span style="color: #bdbdbd;">.</span>AddOpenTelemetry<span style="color: #bdbdbd;">()<br /></span><span style="color: #bdbdbd;"> .</span>WithTracing<span style="color: #bdbdbd;">(builder </span>=> <span style="color: #bdbdbd;">builder.</span>AddJaegerExporter<span style="color: #bdbdbd;">()</span><span style="color: #e1bfff;">..</span><span style="color: #bdbdbd;">.)<br /></span><span style="color: #bdbdbd;"> .</span>WithMetrics<span style="color: #bdbdbd;">(builder </span>=> <span style="color: #bdbdbd;">builder.</span>AddPrometheusExporter<span style="color: #bdbdbd;">()</span><span style="color: #e1bfff;">..</span><span style="color: #bdbdbd;">.)</span></pre></div><p><br /></p><p><span><span><span></span></span></span></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjWsyTaKsCyg4J5k7rKFScGN5BvNAU3bL3UZbHTkz83xd1E6R-Twp3_LuDlYH5kJjUecLVxZnZowjXRiEtzcLLEI4VbO9qTaF7EwZtWBH2wI20jjwe1r783Ue_JCiEWcjQjYFmwau_9vvr9WMrtmZkz3noxcnGVQ-sgEvkdcnLMCtDEqFkwkFvi0tWTfA" style="margin-left: auto; margin-right: auto;"><img alt="https://opentelemetry.io/docs/" data-original-height="981" data-original-width="1500" height="418" src="https://blogger.googleusercontent.com/img/a/AVvXsEjWsyTaKsCyg4J5k7rKFScGN5BvNAU3bL3UZbHTkz83xd1E6R-Twp3_LuDlYH5kJjUecLVxZnZowjXRiEtzcLLEI4VbO9qTaF7EwZtWBH2wI20jjwe1r783Ue_JCiEWcjQjYFmwau_9vvr9WMrtmZkz3noxcnGVQ-sgEvkdcnLMCtDEqFkwkFvi0tWTfA=w640-h418" title="https://opentelemetry.io/docs/" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">https://opentelemetry.io/docs/<br /><br /></td></tr></tbody></table><p></p><p> <b>Logging</b>: Microsoft.Extensions.Logging.Abstractions kütüphanesine bağımlılık içerir, bu nedenle projenizde Microsoft tarafından önerilen loglama kullanmalısınız, aksi takdirde CorelationID vb. ile ilgili birçok bilgiyi almakta sorunlar yaşanabilir. Bununla beraber logları düz metin(unstructured) ve json yapıları(structured) olarak 2 şekilde tutabiliyoruz. Düz metin olarak tutmak daha kolay iken, nesne olarak tutmak ise tavsiye edilen yöntemdir.</p><div style="background-color: #262626; color: #d0d0d0; font-family: "JetBrains Mono", monospace; font-size: 9.8pt;"><pre><div style="font-family: "JetBrains Mono", monospace; font-size: 9.8pt;"><pre><span style="color: #bdbdbd;">[</span><span style="color: #c191ff;">HttpGet</span><span style="color: #bdbdbd;">(</span><span style="color: #c9a26d;">"log"</span><span style="color: #bdbdbd;">)]<br /></span><span style="color: #6c95eb;">public </span><span style="color: #c191ff;">void </span><span style="color: #39cc8f;">Log</span><span style="color: #bdbdbd;">()<br /></span><span style="color: #bdbdbd;">{<br /></span><span style="color: #bdbdbd;"> </span><span style="color: #66c3cc;">_logger</span><span style="color: #bdbdbd;">.</span><span style="color: #39cc8f;">LogInformation</span><span style="color: #bdbdbd;">(</span><span style="color: #c9a26d;">"Hello! It is </span><span style="color: #c191ff;">{Time}</span><span style="color: #c9a26d;">"</span><span style="color: #bdbdbd;">, </span><span style="color: #e1bfff;">DateTime</span><span style="color: #bdbdbd;">.</span><span style="color: #66c3cc;">UtcNow</span><span style="color: #bdbdbd;">);<br /></span><span style="color: #bdbdbd;"> </span><span style="color: #66c3cc;">_logger</span><span style="color: #bdbdbd;">.</span><span style="color: #39cc8f;">LogError</span><span style="color: #bdbdbd;">(</span><span style="color: #c9a26d;">"Test Error"</span><span style="color: #bdbdbd;">);</span><span style="color: #bdbdbd;"><br /></span><span style="color: #bdbdbd;">}</span></pre></div></pre></div><div style="background-color: #262626; color: #d0d0d0; font-family: "JetBrains Mono", monospace; font-size: 9.8pt;"><pre><span style="color: #bdbdbd;">[</span><span style="color: #c191ff;">Fact</span><span style="color: #bdbdbd;">]<br /></span><span style="color: #6c95eb;">public void </span><span style="color: #39cc8f;">LogTest</span><span style="color: #bdbdbd;">()<br /></span><span style="color: #bdbdbd;">{<br /></span><span style="color: #bdbdbd;"> </span><span style="color: #6c95eb;">var </span><span style="color: #bdbdbd;">exception = </span><span style="color: #c191ff;">Record</span><span style="color: #bdbdbd;">.</span><span style="color: #39cc8f;">Exception</span><span style="color: #bdbdbd;">(() </span>=> <span style="color: #66c3cc;">_exampleController</span><span style="color: #bdbdbd;">.</span><span style="color: #39cc8f;">Log</span><span style="color: #bdbdbd;">());<br /></span><span style="color: #bdbdbd;"> </span><span style="color: #c191ff;">Assert</span><span style="color: #bdbdbd;">.</span><span style="color: #39cc8f;">Null</span><span style="color: #bdbdbd;">(exception);<br /></span><span style="color: #bdbdbd;">}</span></pre></div><p><span><span> </span></span></p><p><span><b><span> </span>Tracing</b>: </span>System.Diagnostics'e bağlıdır ve Microsoft'tan gelen bu verileri geliştirir ve belirli kütüphaneler için hazır hale getirir. Biz burada Zipkin ve Jaeger ile ayarlarını tamamlayıp daha sonra docker ile bu araçları ayağa kaldırarak yapmış olduğumuz kayıtları göreceğiz.</p><div style="background-color: #262626; color: #d0d0d0; font-family: "JetBrains Mono", monospace; font-size: 9.8pt;"><pre><span style="color: #bdbdbd;">services.</span><span style="color: #39cc8f;">AddOpenTelemetry</span><span style="color: #bdbdbd;">()<br /></span><span style="color: #bdbdbd;"> .</span><span style="color: #39cc8f;">WithTracing</span><span style="color: #bdbdbd;">(tracingProviderBuilder </span>=> <span style="color: #bdbdbd;">tracingProviderBuilder<br /></span><span style="color: #bdbdbd;"> .</span><span style="color: #39cc8f;">AddAspNetCoreInstrumentation</span><span style="color: #bdbdbd;">()<br /></span><span style="color: #bdbdbd;"> .</span><span style="color: #39cc8f;">AddHttpClientInstrumentation</span><span style="color: #bdbdbd;">()<br /></span><span style="color: #bdbdbd;"> .</span><span style="color: #39cc8f;">AddConsoleExporter</span><span style="color: #bdbdbd;">()<br /></span><span style="color: #bdbdbd;"> .</span><span style="color: #39cc8f;">AddJaegerExporter</span><span style="color: #bdbdbd;">()<br /></span><span style="color: #bdbdbd;"> .</span><span style="color: #39cc8f;">AddZipkinExporter</span><span style="color: #bdbdbd;">()<br /></span><span style="color: #bdbdbd;"> .</span><span style="color: #39cc8f;">AddSource</span><span style="color: #bdbdbd;">(</span><span style="color: #c9a26d;">"Tracing.NET"</span><span style="color: #bdbdbd;">)<br /></span><span style="color: #bdbdbd;"> .</span><span style="color: #39cc8f;">SetResourceBuilder</span><span style="color: #bdbdbd;">(<br /></span><span style="color: #bdbdbd;"> </span><span style="color: #c191ff;">ResourceBuilder</span><span style="color: #bdbdbd;">.</span><span style="color: #39cc8f;">CreateDefault</span><span style="color: #bdbdbd;">()<br /></span><span style="color: #bdbdbd;"> .</span>AddService<span style="color: #bdbdbd;">(</span><span style="color: #c9a26d;">"Tracing.NET"</span><span style="color: #bdbdbd;">)))</span></pre></div><div style="background-color: #262626; color: #d0d0d0; font-family: "JetBrains Mono", monospace; font-size: 9.8pt;"><pre><span style="color: #bdbdbd;">[</span><span style="color: #c191ff;">HttpGet</span><span style="color: #bdbdbd;">(</span><span style="color: #c9a26d;">"tracing"</span><span style="color: #bdbdbd;">)]<br /></span><span style="color: #6c95eb;">public async </span><span style="color: #c191ff;">Task </span><span style="color: #39cc8f;">Tracing</span><span style="color: #bdbdbd;">()<br /></span><span style="color: #bdbdbd;">{<br /></span><span style="color: #bdbdbd;"> </span><span style="color: #6c95eb;">using var </span><span style="color: #bdbdbd;">activity = </span><span style="color: #66c3cc;">ActivitySource</span><span style="color: #bdbdbd;">.</span><span style="color: #39cc8f;">StartActivity</span><span style="color: #bdbdbd;">(</span><span style="color: #c9a26d;">"Example"</span><span style="color: #bdbdbd;">);<br /></span><span style="color: #bdbdbd;"><br /></span><span style="color: #bdbdbd;"> </span><span style="color: #85c46c; font-style: italic;">// note that "sampleActivity" can be null here if nobody listen events generated<br /></span><span style="color: #85c46c; font-style: italic;"> // by the "SampleActivitySource" activity source.<br /></span><span style="color: #85c46c; font-style: italic;"> </span><span style="color: #bdbdbd;">activity</span>?<span style="color: #bdbdbd;">.</span><span style="color: #39cc8f;">AddTag</span><span style="color: #bdbdbd;">(</span><span style="color: #c9a26d;">"UserId"</span><span style="color: #bdbdbd;">, </span><span style="color: #c9a26d;">"AnyUser"</span><span style="color: #bdbdbd;">);<br /></span><span style="color: #bdbdbd;"><br /></span><span style="color: #bdbdbd;"> </span><span style="color: #85c46c; font-style: italic;">// Simulate a long running operation<br /></span><span style="color: #85c46c; font-style: italic;"> </span><span style="color: #6c95eb;">await </span><span style="color: #c191ff;">Task</span><span style="color: #bdbdbd;">.</span><span style="color: #39cc8f;">Delay</span><span style="color: #bdbdbd;">(</span><span style="color: #ed94c0;">500</span><span style="color: #bdbdbd;">);<br /></span><span style="color: #bdbdbd;">}</span></pre></div><div style="background-color: #262626; color: #d0d0d0; font-family: "JetBrains Mono", monospace; font-size: 9.8pt;"><pre><span style="color: #bdbdbd;">[</span><span style="color: #c191ff;">Fact</span><span style="color: #bdbdbd;">]<br /></span><span style="color: #6c95eb;">public async </span><span style="color: #c191ff;">Task </span><span style="color: #39cc8f;">GivenInitialRequest_WhenTracingCalled</span><span style="color: #bdbdbd;">()<br /></span><span style="color: #bdbdbd;">{<br /></span><span style="color: #bdbdbd;"> </span><span style="color: #85c46c; font-style: italic;">// Arrange<br /></span><span style="color: #85c46c; font-style: italic;"> </span><span style="color: #6c95eb;">var </span><span style="color: #bdbdbd;">activitiesStarted = </span><span style="color: #39cc8f;">SetupActivityListener</span><span style="color: #bdbdbd;">(); // Tüm sınıfa erişmek için<br /></span><span style="color: #bdbdbd;"><br /></span><span style="color: #bdbdbd;"> </span><span style="color: #85c46c; font-style: italic;">// Act<br /></span><span style="color: #85c46c; font-style: italic;"> </span><span style="color: #6c95eb;">await </span><span style="color: #66c3cc;">_exampleController</span><span style="color: #bdbdbd;">.</span><span style="color: #39cc8f;">Tracing</span><span style="color: #bdbdbd;">();<br /></span><span style="color: #bdbdbd;"><br /></span><span style="color: #bdbdbd;"> </span><span style="color: #85c46c; font-style: italic;">// Assert<br /></span><span style="color: #85c46c; font-style: italic;"> </span><span style="color: #c191ff;">Assert</span><span style="color: #bdbdbd;">.</span><span style="color: #39cc8f;">Single</span><span style="color: #bdbdbd;">(activitiesStarted);<br /></span><span style="color: #bdbdbd;"> </span><span style="color: #c191ff;">Assert</span><span style="color: #bdbdbd;">.</span><span style="color: #39cc8f;">Contains</span><span style="color: #bdbdbd;">(</span><span style="color: #c9a26d;">"Example"</span><span style="color: #bdbdbd;">, activitiesStarted.</span><span style="color: #39cc8f;">Select</span><span style="color: #bdbdbd;">(a </span>=> <span style="color: #bdbdbd;">a.</span><span style="color: #66c3cc;">DisplayName</span><span style="color: #bdbdbd;">));<br /></span><span style="color: #bdbdbd;"> </span><span style="color: #c191ff;">Assert</span><span style="color: #bdbdbd;">.</span><span style="color: #39cc8f;">NotNull</span><span style="color: #bdbdbd;">(activitiesStarted.</span><span style="color: #39cc8f;">Select</span><span style="color: #bdbdbd;">(a </span>=> <span style="color: #bdbdbd;">a.</span><span style="color: #66c3cc;">Tags</span><span style="color: #bdbdbd;">));<br /></span><span style="color: #bdbdbd;">}</span></pre></div><p><span> Zipkin ve Jaeger araçlarını isterseniz bilgisayar ortamınıza kurabilirsiniz. Biz burada docker ile ayağa kaldırarak yola devam etmeyi tercih ettik.<br /></span></p><div style="background-color: #262626; color: #d0d0d0; font-family: "JetBrains Mono", monospace; font-size: 9.8pt;"><pre>docker run <span style="color: #bdbdbd;">-</span>d <span style="color: #bdbdbd;">--</span>name jaeger <span style="color: #bdbdbd;">-</span>p <span style="color: #ed94c0;">16686</span>:<span style="color: #ed94c0;">16686 </span><span style="color: #bdbdbd;">-</span>p <span style="color: #ed94c0;">6831</span>:<span style="color: #ed94c0;">6831</span><span style="color: #bdbdbd;">/</span>udp jaegertracing<span style="color: #bdbdbd;">/</span>all<span style="color: #bdbdbd;">-</span><span style="color: #6c95eb;">in</span><span style="color: #bdbdbd;">-</span>one:<span style="color: #ed94c0;">1.21<br /></span>docker run <span style="color: #bdbdbd;">-</span>d <span style="color: #bdbdbd;">-</span>p <span style="color: #ed94c0;">9411</span>:<span style="color: #ed94c0;">9411 </span>openzipkin<span style="color: #bdbdbd;">/</span>zipkin</pre></div><p><span><span><b></b></span></span></p><div style="text-align: center;"><b><a href="https://blogger.googleusercontent.com/img/a/AVvXsEi2yF4rBiw4Yul95RTYwj7yUgjtlip2RTiBk-ZKpReC44R2kPVwFaAmttUUlR8fTePPx_Ks8j_AaJ1Q9oc3CZIk13K1XzwZNRb0guBoZx_QZmNEatHwSNCmi4vvJOxlhrRW2QzHdPa_37WzXGRW9gbZzX8qzwFyGlB9h3_EVh6Ao6kAxbPCvh3TzyP1Jg"><img alt="" data-original-height="869" data-original-width="1972" height="282" src="https://blogger.googleusercontent.com/img/a/AVvXsEi2yF4rBiw4Yul95RTYwj7yUgjtlip2RTiBk-ZKpReC44R2kPVwFaAmttUUlR8fTePPx_Ks8j_AaJ1Q9oc3CZIk13K1XzwZNRb0guBoZx_QZmNEatHwSNCmi4vvJOxlhrRW2QzHdPa_37WzXGRW9gbZzX8qzwFyGlB9h3_EVh6Ao6kAxbPCvh3TzyP1Jg=w640-h282" width="640" /></a></b></div><b><br /><br /></b><p></p><p><span><span><b><span> </span>Metrics</b>: </span></span>System.Diagnostics'e bağlıdır. Eğer .Net tarafında bu konuya aşina iseniz, 4 metriği desteklediğini kolayca hatırlayacaksınız. Bunlar: Counter, ObservableCounter, Histogram ve ObservableGauge. Burada ise hala üzerinde çalışılmaya devam eden Prometheus aracını kullanacağız.</p><div style="background-color: #262626; font-family: "JetBrains Mono", monospace; font-size: 9.8pt;"><pre><span style="color: #bdbdbd;">services.</span><span style="color: #39cc8f;">WithMetrics</span><span style="color: #bdbdbd;">(metricsProviderBuilder </span><span style="color: #d0d0d0;">=> </span><span style="color: #bdbdbd;">metricsProviderBuilder<br /></span><span style="color: #bdbdbd;"> .</span><span style="color: #39cc8f;">AddConsoleExporter</span><span style="color: #bdbdbd;">()<br /></span><span style="color: #bdbdbd;"> .</span><span style="color: #39cc8f;">AddAspNetCoreInstrumentation</span><span style="color: #bdbdbd;">()<br /></span><span style="color: #bdbdbd;"> .</span><span style="color: #39cc8f;">AddHttpClientInstrumentation</span><span style="color: #bdbdbd;">()<br /></span><span style="color: #bdbdbd;"> .</span><span style="color: #39cc8f;">AddRuntimeInstrumentation</span><span style="color: #bdbdbd;">()<br /></span><span style="color: #bdbdbd;"> .</span><span style="color: #39cc8f;">AddPrometheusExporter</span><span style="color: #bdbdbd;">()<br /></span><span style="color: #bdbdbd;"> .</span><span style="color: #39cc8f;">AddMeter</span><span style="color: #bdbdbd;">(</span><span style="color: #c9a26d;">"Metrics.NET"</span><span style="color: #bdbdbd;">)<br /></span><span style="color: #bdbdbd;"> .</span><span style="color: #39cc8f;">AddView</span><span style="color: #bdbdbd;">(<br /></span><span style="color: #bdbdbd;"> instrumentName</span><span style="color: #d0d0d0;">: </span><span style="color: #c9a26d;">"components-per-order"</span><span style="color: #bdbdbd;">,<br /></span><span style="color: #bdbdbd;"> </span><span style="color: #6c95eb;">new </span><span style="color: #c191ff;">ExplicitBucketHistogramConfiguration<br /></span><span style="color: #c191ff;"> </span><span style="color: #bdbdbd;">{<br /></span><span style="color: #bdbdbd;"> </span><span style="color: #66c3cc;">Boundaries </span><span style="color: #bdbdbd;">= </span><span style="color: #6c95eb;">new double</span><span style="color: #bdbdbd;">[] { </span><span style="color: #ed94c0;">1</span><span style="color: #bdbdbd;">, </span><span style="color: #ed94c0;">2</span><span style="color: #bdbdbd;">, </span><span style="color: #ed94c0;">5</span><span style="color: #ed94c0;"> </span><span style="color: #bdbdbd;">}<br /></span><span style="color: #bdbdbd;"> }))
//Diğer ayarlar
</span><span style="color: #d0d0d0;">app.</span><span style="color: #39cc8f; font-family: "JetBrains Mono", monospace; font-size: 9.8pt;">UseOpenTelemetryPrometheusScrapingEndpoint</span><span style="color: #bdbdbd; font-family: "JetBrains Mono", monospace; font-size: 9.8pt;">();</span></pre></div><p><br /></p><div style="background-color: #262626; color: #d0d0d0; font-family: "JetBrains Mono", monospace; font-size: 9.8pt;"><pre><span style="color: #bdbdbd;">[</span><span style="color: #c191ff;">HttpGet</span><span style="color: #bdbdbd;">(</span><span style="color: #c9a26d;">"metric"</span><span style="color: #bdbdbd;">)]<br /></span><span style="color: #6c95eb;">public </span><span style="color: #c191ff;">Counter</span><span style="color: #bdbdbd;"><</span><span style="color: #6c95eb;">int</span><span style="color: #bdbdbd;">> </span><span style="color: #39cc8f;">Metric</span><span style="color: #bdbdbd;">()<br /></span><span style="color: #bdbdbd;">{<br /></span><span style="color: #bdbdbd;"> </span><span style="color: #85c46c; font-style: italic;">//Metric<br /></span><span style="color: #85c46c; font-style: italic;"> </span><span style="color: #6c95eb;">var </span><span style="color: #bdbdbd;">meter = </span><span style="color: #6c95eb;">new </span><span style="color: #c191ff;">Meter</span><span style="color: #bdbdbd;">(</span><span style="color: #c9a26d;">"Metrics.NET"</span><span style="color: #bdbdbd;">);<br /></span><span style="color: #bdbdbd;"><br /></span><span style="color: #bdbdbd;"> </span><span style="color: #6c95eb;">var </span><span style="color: #bdbdbd;">counter = meter.</span><span style="color: #39cc8f;">CreateCounter</span><span style="color: #bdbdbd;"><</span><span style="color: #6c95eb;">int</span><span style="color: #bdbdbd;">>(</span><span style="color: #c9a26d;">"RequestsOfCounter"</span><span style="color: #bdbdbd;">, </span><span style="color: #c9a26d;">"ms"</span><span style="color: #bdbdbd;">, </span><span style="color: #c9a26d;">"Example request"</span><span style="color: #bdbdbd;">);<br /></span><span style="color: #bdbdbd;"> meter.</span><span style="color: #39cc8f;">CreateObservableGauge</span><span style="color: #bdbdbd;">(</span><span style="color: #c9a26d;">"ThreadCount"</span><span style="color: #bdbdbd;">,<br /></span><span style="color: #bdbdbd;"> () </span>=> <span style="color: #6c95eb;">new</span><span style="color: #bdbdbd;">[] { </span><span style="color: #6c95eb;">new </span><span style="color: #e1bfff;">Measurement</span><span style="color: #bdbdbd;"><</span><span style="color: #6c95eb;">int</span><span style="color: #bdbdbd;">>(</span><span style="color: #c191ff;">ThreadPool</span><span style="color: #bdbdbd;">.</span><span style="color: #66c3cc;">ThreadCount</span><span style="color: #bdbdbd;">) });<br /></span><span style="color: #bdbdbd;"><br /></span><span style="color: #bdbdbd;"> </span><span style="color: #85c46c; font-style: italic;">// Measure the number of requests<br /></span><span style="color: #85c46c; font-style: italic;"> </span><span style="color: #bdbdbd;">counter.</span><span style="color: #39cc8f;">Add</span><span style="color: #bdbdbd;">(</span><span style="color: #ed94c0;">1</span><span style="color: #bdbdbd;">, </span><span style="color: #c191ff;">KeyValuePair</span><span style="color: #bdbdbd;">.</span><span style="color: #39cc8f;">Create</span><span style="color: #bdbdbd;"><</span><span style="color: #6c95eb;">string</span><span style="color: #bdbdbd;">, </span><span style="color: #6c95eb;">object</span><span style="color: #bdbdbd;">>(</span><span style="color: #c9a26d;">"name"</span><span style="color: #bdbdbd;">, </span><span style="color: #c9a26d;">"Türkiye"</span><span style="color: #bdbdbd;">));<br /></span><span style="color: #bdbdbd;"><br /></span><span style="color: #bdbdbd;"> </span><span style="color: #6c95eb;">return </span><span style="color: #bdbdbd;">counter;<br /></span><span style="color: #bdbdbd;">}</span></pre></div><p><br /></p><div style="background-color: #262626; color: #d0d0d0; font-family: "JetBrains Mono", monospace; font-size: 9.8pt;"><pre><span style="color: #bdbdbd;">[</span><span style="color: #c191ff;">Fact</span><span style="color: #bdbdbd;">]<br /></span><span style="color: #6c95eb;">public void </span><span style="color: #39cc8f;">MetricTest</span><span style="color: #bdbdbd;">()<br /></span><span style="color: #bdbdbd;">{<br /></span><span style="color: #bdbdbd;"> </span><span style="color: #85c46c; font-style: italic;">// Act<br /></span><span style="color: #85c46c; font-style: italic;"> </span><span style="color: #6c95eb;">var </span><span style="color: #bdbdbd;">counter = </span><span style="color: #66c3cc;">_exampleController</span><span style="color: #bdbdbd;">.</span><span style="color: #39cc8f;">Metric</span><span style="color: #bdbdbd;">();<br /></span><span style="color: #bdbdbd;"> </span><span style="color: #c191ff;">Assert</span><span style="color: #bdbdbd;">.</span><span style="color: #39cc8f;">NotNull</span><span style="color: #bdbdbd;">(counter);<br /></span><span style="color: #bdbdbd;"> </span><span style="color: #c191ff;">Assert</span><span style="color: #bdbdbd;">.</span><span style="color: #39cc8f;">Contains</span><span style="color: #bdbdbd;">(</span><span style="color: #c9a26d;">"RequestsOfCounter"</span><span style="color: #bdbdbd;">, counter.</span><span style="color: #66c3cc;">Name</span><span style="color: #bdbdbd;">);<br /></span><span style="color: #bdbdbd;"><br /></span><span style="color: #bdbdbd;"> </span><span style="color: #85c46c; font-style: italic;">// Act<br /></span><span style="color: #85c46c; font-style: italic;"> </span><span style="color: #6c95eb;">var </span><span style="color: #bdbdbd;">meter = </span><span style="color: #39cc8f;">SetupMeterListener</span><span style="color: #bdbdbd;">();<br /></span><span style="color: #bdbdbd;"><br /></span><span style="color: #bdbdbd;"> </span><span style="color: #85c46c; font-style: italic;">// Assert<br /></span><span style="color: #85c46c; font-style: italic;"> </span><span style="color: #c191ff;">Assert</span><span style="color: #bdbdbd;">.</span><span style="color: #39cc8f;">NotNull</span><span style="color: #bdbdbd;">(meter);<br /></span><span style="color: #bdbdbd;"> </span><span style="color: #c191ff;">Assert</span><span style="color: #bdbdbd;">.</span><span style="color: #39cc8f;">Equal</span><span style="color: #bdbdbd;">(</span><span style="color: #c9a26d;">"Metrics.NET"</span><span style="color: #bdbdbd;">, meter.</span><span style="color: #66c3cc;">Name</span><span style="color: #bdbdbd;">);<br /></span><span style="color: #bdbdbd;">}</span></pre></div><p><span> Prometheus isterseniz bilgisayar ortamınıza kurabilirsiniz. Biz burada docker ile ayağa kaldırarak yola devam etmeyi tercih ettik. Ayrıca buradaki verileri kaybetmek istemiyorsanız volume yapısı için ayarlamaları da tamamlamanız gerekecektir. Ayrıntılar için <a href="https://prometheus.io/docs/prometheus/latest/installation/#volumes-bind-mount" target="_blank">buraya</a> bakabilirsiniz.</span></p><p><span></span></p><div style="background-color: #262626; color: #d0d0d0; font-family: "JetBrains Mono", monospace; font-size: 9.8pt;"><pre>docker run <span style="color: #bdbdbd;">-</span>d <span style="color: #bdbdbd;">-</span>p <span style="color: #ed94c0;">9090</span>:<span style="color: #ed94c0;">9090 </span>prom<span style="color: #bdbdbd;">/</span>prometheus</pre></div><p><span><span style="background-color: #262626; color: #bdbdbd; font-family: "JetBrains Mono", monospace; font-size: 9.8pt;">-</span><span style="background-color: #262626; color: #d0d0d0; font-family: "JetBrains Mono", monospace; font-size: 9.8pt;">v </span><span style="background-color: #262626; color: #bdbdbd; font-family: "JetBrains Mono", monospace; font-size: 9.8pt;">/</span><span style="background-color: #262626; color: #d0d0d0; font-family: "JetBrains Mono", monospace; font-size: 9.8pt;">var</span><span style="background-color: #262626; color: #bdbdbd; font-family: "JetBrains Mono", monospace; font-size: 9.8pt;">/</span><span style="background-color: #262626; color: #d0d0d0; font-family: "JetBrains Mono", monospace; font-size: 9.8pt;">folders</span><span style="background-color: #262626; color: #bdbdbd; font-family: "JetBrains Mono", monospace; font-size: 9.8pt;">/</span><span style="background-color: #262626; color: #d0d0d0; font-family: "JetBrains Mono", monospace; font-size: 9.8pt;">prometheus</span><span style="background-color: #262626; color: #bdbdbd; font-family: "JetBrains Mono", monospace; font-size: 9.8pt;">.</span><span style="background-color: #262626; color: #d0d0d0; font-family: "JetBrains Mono", monospace; font-size: 9.8pt;">yml:</span><span style="background-color: #262626; color: #bdbdbd; font-family: "JetBrains Mono", monospace; font-size: 9.8pt;">/</span><span style="background-color: #262626; color: #d0d0d0; font-family: "JetBrains Mono", monospace; font-size: 9.8pt;">etc</span><span style="background-color: #262626; color: #bdbdbd; font-family: "JetBrains Mono", monospace; font-size: 9.8pt;">/</span><span style="background-color: #262626; color: #d0d0d0; font-family: "JetBrains Mono", monospace; font-size: 9.8pt;">prometheus</span><span style="background-color: #262626; color: #bdbdbd; font-family: "JetBrains Mono", monospace; font-size: 9.8pt;">/</span><span style="background-color: #262626; color: #d0d0d0; font-family: "JetBrains Mono", monospace; font-size: 9.8pt;">prometheus</span><span style="background-color: #262626; color: #bdbdbd; font-family: "JetBrains Mono", monospace; font-size: 9.8pt;">.</span><span style="background-color: #262626; color: #d0d0d0; font-family: "JetBrains Mono", monospace; font-size: 9.8pt;">yml</span> //volume ayarı </span></p><p> <b>Otel Collector ile dinamik ayarlama</b><br /></p><p><b> </b>Şimdiye kadar anlattığımız kısımlar her araç olarak statik tanımlama ile ele aldık. Bunların ilgili paketlerini, docker konfigürasyonlarını hepsini manuel olarak ele almak lazım. Bunun yerine basit birkaç ayar ile dinamik olarak halledilebilir. Bunu sağlayan yapıta otel collector deniliyor.<br /></p><pre style="background-color: #262626; font-size: 13.0667px;"><span style="color: #39cc8f;">.AddJaegerExporter()</span></pre><pre style="background-color: #262626; font-size: 13.0667px;"><pre><span style="color: #39cc8f;">.AddZipkinExporter()</span></pre></pre><div style="background-color: #262626; color: #d0d0d0; font-family: "JetBrains Mono", monospace; font-size: 9.8pt;"><pre><pre style="color: black;"><span style="color: #39cc8f;">.AddPrometheusExporter()</span></pre></pre></div><div style="background-color: #262626; color: #d0d0d0; font-family: "JetBrains Mono", monospace; font-size: 9.8pt;"><pre><span style="color: #bdbdbd;">.</span>AddOtlpExporter<span style="color: #bdbdbd;">(</span>options => options<span style="color: #bdbdbd;">.</span>Endpoint <span style="color: #bdbdbd;">= </span><span style="color: #6c95eb;">new </span>Uri<span style="color: #bdbdbd;">(</span><span style="color: #c9a26d;">"http://localhost:4317"</span><span style="color: #bdbdbd;">));</span></pre></div><p><b> </b>Yukarıda static olarak belirttiğimiz araçların yerine aşağıdaki kod satırı ile bunu dinamik olarak ele alabiliriz. Bu sayede araçlara direkt olarak olan bağımlılığımız kalkar ve hızlı bir şekilde sadece ayar dosyasından istediğimiz aracı bu şekilde kullanabiliriz. Bu bize büyük bir esneklik kazandırıyor. Örnek olmasına adına aşağıya ufak bir kesit bırakıyoruz.<br /></p><div style="background-color: #262626; color: #d0d0d0; font-family: "JetBrains Mono", monospace; font-size: 9.8pt;"><pre><span style="color: #c191ff;">service</span><span style="color: #bdbdbd; font-weight: bold;">:<br /></span><span style="color: #bdbdbd; font-weight: bold;"> </span><span style="color: #c191ff;">pipelines</span><span style="color: #bdbdbd; font-weight: bold;">:<br /></span><span style="color: #bdbdbd; font-weight: bold;"> </span><span style="color: #c191ff;">traces</span><span style="color: #bdbdbd; font-weight: bold;">:<br /></span><span style="color: #bdbdbd; font-weight: bold;"> </span><span style="color: #c191ff;">receivers</span><span style="color: #bdbdbd; font-weight: bold;">: [ </span><span style="color: #bdbdbd;">otlp </span><span style="color: #bdbdbd; font-weight: bold;">]<br /></span><span style="color: #bdbdbd; font-weight: bold;"> </span><span style="color: #c191ff;">processors</span><span style="color: #bdbdbd; font-weight: bold;">: [ </span><span style="color: #bdbdbd;">batch </span><span style="color: #bdbdbd; font-weight: bold;">]<br /></span><span style="color: #bdbdbd; font-weight: bold;"> </span><span style="color: #c191ff;">exporters</span><span style="color: #bdbdbd; font-weight: bold;">: [ </span><span style="color: #bdbdbd;">logging</span><span style="color: #bdbdbd; font-weight: bold;">, </span><span style="color: #bdbdbd;">jaeger </span><span style="color: #bdbdbd; font-weight: bold;">]<br /></span><span style="color: #bdbdbd; font-weight: bold;"> </span><span style="color: #c191ff;">metrics</span><span style="color: #bdbdbd; font-weight: bold;">:<br /></span><span style="color: #bdbdbd; font-weight: bold;"> </span><span style="color: #c191ff;">receivers</span><span style="color: #bdbdbd; font-weight: bold;">: [ </span><span style="color: #bdbdbd;">otlp </span><span style="color: #bdbdbd; font-weight: bold;">]<br /></span><span style="color: #bdbdbd; font-weight: bold;"> </span><span style="color: #c191ff;">processors</span><span style="color: #bdbdbd; font-weight: bold;">: [ </span><span style="color: #bdbdbd;">batch </span><span style="color: #bdbdbd; font-weight: bold;">]<br /></span><span style="color: #bdbdbd; font-weight: bold;"> </span><span style="color: #c191ff;">exporters</span><span style="color: #bdbdbd; font-weight: bold;">: [ </span><span style="color: #bdbdbd;">logging</span><span style="color: #bdbdbd; font-weight: bold;">, </span><span style="color: #bdbdbd;">prometheus </span><span style="color: #bdbdbd; font-weight: bold;">]<br /></span><span style="color: #bdbdbd; font-weight: bold;"> </span><span style="color: #c191ff;">logs</span><span style="color: #bdbdbd; font-weight: bold;">:<br /></span><span style="color: #bdbdbd; font-weight: bold;"> </span><span style="color: #c191ff;">receivers</span><span style="color: #bdbdbd; font-weight: bold;">: [ </span><span style="color: #bdbdbd;">otlp </span><span style="color: #bdbdbd; font-weight: bold;">]<br /></span><span style="color: #bdbdbd; font-weight: bold;"> </span><span style="color: #c191ff;">processors</span><span style="color: #bdbdbd; font-weight: bold;">: [ ]<br /></span><span style="color: #bdbdbd; font-weight: bold;"> </span><span style="color: #c191ff;">exporters</span><span style="color: #bdbdbd; font-weight: bold;">: [ </span><span style="color: #bdbdbd;">logging</span><span style="color: #bdbdbd; font-weight: bold;">, </span><span style="color: #bdbdbd;">file </span><span style="color: #bdbdbd; font-weight: bold;">]</span></pre></div><p> Tabi bunun için de yaml dosyalarını düzenlemek lazım. Kabaca <b style="font-style: italic;">otel-collector-config.yaml (</b>yukarıdaki kod parçası bu dosyadan<b style="font-style: italic;">)</b> ve bu ayarları kullanan <b><i>docker-compose.yaml</i></b> olmalı. Eğer prometheus kullanacaksanız ve buradaki verilerin kalıcı olmasını(volume) da istiyorsanız yukarıda da bahsettiğimiz gibi <i><b>prometheus.yaml</b></i> adında başka bir dosyasınız olması gerekir. Bunun yaml dosyalarını tamamını burada paylaşmak yerine sizi şuradaki <a href="https://opentelemetry.io/docs/collector/configuration/" target="_blank">linke</a> yönlendireyim. Hem yazıyı daha fazla uzatmama hem de farklı ayarlar görmeniz adına daha iyi olacağını düşünüyorum.<br /></p><p><span> Özetlemek gerekirse birçok noktada hala stabil olmamasına rağmen kısa sürede sektörde adını duyurmayı başarmış ve birçok projede de kendisine yer bulmuş bir araçtır. Bununla birlikte ileride adını çok daha sık duyabiliriz.</span><br /></p><p><span><span> Yazıyı bir hadisi şerifle bitiriyoruz.</span><br /></span></p><p><span><span></span></span></p><blockquote><p><span><span>İbn Abbâs –radıyallahu anhuma-’nın merfu olarak rivâyet ettiği hadiste: Rasûlullah -sallallahu aleyhi ve sellem- şöyle buyurmuştur:</span></span></p><p><span><span> "İki göz var ki ateş onlara değmeyecektir. Allah’ın azabından korkarak ağlayan göz ve Allah yolunda nöbet bekleyen göz."</span></span></p></blockquote><p> </p><p><span><span></span></span></p><p><b>Kaynakça</b></p><p><a href="https://opentelemetry.io/docs/instrumentation/net/exporters/">https://opentelemetry.io/docs/instrumentation/net/exporters/</a></p><p><a href="https://code-maze.com/tracking-dotnet-opentelemetry-metrics/">https://code-maze.com/tracking-dotnet-opentelemetry-metrics/</a></p><p><a href="https://code-maze.com/tracing-dotnet-applications-opentelemetry/">https://code-maze.com/tracing-dotnet-applications-opentelemetry/</a></p><p><a href="https://www.meziantou.net/monitoring-a-dotnet-application-using-opentelemetry.htm">https://www.meziantou.net/monitoring-a-dotnet-application-using-opentelemetry.htm</a></p><p><a href="https://www.logicmonitor.com/blog/opentelemetry-vs-prometheus">https://www.logicmonitor.com/blog/opentelemetry-vs-prometheus</a> (Koddan bağımsız güzel bir yazı)</p>malik masishttp://www.blogger.com/profile/06624991798770591895noreply@blogger.com0