Aylık Arşiv: Ocak 2017

Yazılımcılar ve İşsizlik

TÜİK’in son açıkladığı(16.01.2017 tarihinde) verilere göre işsizlik oranı bir önceki seneye göre %1,3 artarak %11,8 olmuş. Verilere daha detaylı bakınca tarım dışı işsizlik oranının 1,5 puanlık artış ile %14,1 , genç nüfustaki (15-24 yaş) işsizlik oranının 1,9 puanlık artış ile %21,2; 15-64 yaş grubundaki oranın ise 1,3 puanlık artış ile %12 olduğu görülüyor.

Aslında bu veriler Linkedin’deki “iş arıyorum” paylaşımlarının devamlı surette artmasıyla gördüğümüz gerçeğin matematiksel açıklaması.

Piyasanın genelinde görülen sıkıntının finans sektörü özelinde daha fazla olduğu ise arkadaşlarımdan duyduğum ayrı bir konu.

Tabi ki tüm bu sıkıntılardan yazılımcılar da -tüm sektörlerde çalışabildiğimiz için “yazılım sektörü” demek istemiyorum- azade değil elbette. İş arayan pek çok yazılımcıyı görüyor, duyuyor ve yakinen biliyorum.

Bütün bu kasvetli ortamda yazılımcıların diğer meslek grubu mensuplarında olmayan bir avantajı var elbette: Bir iş ortamı zorunluluğu olmadan üretim yapabilmesi. Evden, kafeden, hatta Anadolu’nun ücra bir köyünden. Yeter ki yanında ihtiyacı olan programları muhtevi bir bilgisayarı olsun!

Ben de bu konu üzerinde biraz kafa patlatıp, iş arayan bir yazılımcının “o esnada” neler yapabileceğini düşündüm. İşte aklıma gelenler:

* Öncelikle direkt bir ofis çalışanı olmak dışında freelance ve remote çalışma gibi iş modelleri yaygınlaşıyor. Şu an uluslararası uzaktan çalışma platformları da revaçta. Bunları göz önünde bulundurmakta elbette fayda var. Tabi İngilizce burada ayrı bir önem kazanıyor. Öte yandan imkanı olanlar için yurtdışı da diğer bir seçenek. Örneğin Fransa gibi IT çalışanlarına özel kolaylıklar sunan ülkeler var.

* Dünya her geçen gün daha hızlı dönüyor. Bilişim dünyası ise çok çok çok daha hızlı dönüyor. Geniş vakte sahip olmayı fırsata çevirebileceğimiz en iyi yol: yeni bir şeyler, mesela yeni diller, yeni teknolojiler öğrenmek. Backend, frontend kısıtlarına takılmaksızın Python, Ruby, Go, Angular,PHP, HTML 5, Mobil programlama, IoT(Raspberry Pi, Arduino) .. ve hatta yapay zeka; Lisp, Prolog vs. Öğrenilebilecek sonsuz şey var!

Elbette bu öğrenim sürecini belli konuları önceliklendirerek yapmalıyız ama mutlaka bir öğrenim süreci oluşturmalıyız. Hatta bu öğrenim süreci sadece iş arayanlar için değil tüm yazılımcılar için olmazsa olmaz. Devamlı surette yeni teknolojiler, diller(şu an GoLang’ın yardırması gibi), yaklaşımlar/konseptler(DevOps, Mikroservisler vs) çıkıyor.. ve mesela yıllarca uygulamaya çalıştığımız “code reuse” prensibi için Mikroservis yaklaşımı “bunu o kadar da şa’apmayın” diyebiliyor. Bütün bu değişimlere ayak uydurabilmek için devamlı koşmaktan başka çaremiz de yok.

Hele bir de Endüstri 4.0 (İçinde yapay zeka, makine öğrenimi, IoT, Robotik vs. bir çok teknoloji sayılabilir) olayı var ki(ayrı bir yazı karalama amacındayım E4.0 için) topyekün ülke halinde koşmamız gerekiyor -bu sefer de!- geri kalmamak için.

Neyse konu çok dağıldı. İşin özü yeni bir şeyler öğrenerek hem canlı/diri kalmak hem CV’mizi genişletmek, hem de örneğin blog yazarak, video ders hazırlayarak katma değer üretmek mümkün.

Ve elbette bütün bu söylediklerim için 10 yılını, 15 yılını aynı kurumda, aynı teknolojileri kullanmaya veren arkadaşların “Bu saatten sonra ne öğreneyim?” psikolojisinden sakınmaları gerekiyor.. naçizane tavsiyem.

* Aklıma gelen diğer konu ise özellikle son paragrafta bahsettiğim yıllarını belli teknolojilere vermiş yazılımcılarla ilgili. Bu tecrübelerinizi profesyonel biçimde paylaşabilirsiniz. Ne basılı kitap olarak ne de video ders olarak derinlikli Türkçe kaynaklarımızın sayısı belki 2 elin parmaklarını geçmiyor. Bunları üretebilirsiniz. Kitap yazarak iyi kötü bir gelir de elde edebilirsiniz. Hatta Youtube videoları ile bile az da olsa(tam piyasasını bilmiyorum açıkçası. Mesela 10 bin izlenen bir videodan ortalama ne kadar reklam geliri oluşur?) bir gelir elde edebilirsiniz. Bunun en iyi tarafı da diğer insanlar için de bir şeyler üretiyor olmanız.

* Diğer bir konu ise kendi uygulamalarımızı geliştirebiliriz: Web, mobil.

Örneğin şu videodaki 06:58’de başlayan traktör sitesi olayını dinleyebilirsiniz. “Bu devirde o kadar kolay para yok!” diyor olabilirsiniz. Ama 3 tane PHP sayfası olmasa da kaliteli bir site şablonu hatta frameworkü oluşturup bunu ticari ürüne çevirebilirsiniz. Veya örneğin; 4-5 sene önce bir arkadaşım, geliştirdiği Android döviz uygulamasından aylık 200-300 dolar reklam geliri elde ettiğini söylemişti. Ki o zamanlar da bol miktarda muadili uygulama vardı.

Bunların dışında eksikliğini hissettiğiniz başka uygulamalar da olabilir. Örneğin benim aklıma gelen, bildiğim kadarıyla derli toplu, Türkçe bir “yazılım magazin” sitesi yok. Donanım, girişim, genel teknolojiler hakkında -hepimizin aklına gelecek- başarılı siteler var elbette. Ama yalnız yazılım hakkında aklıma gelen aktüel bir yazılım magazin sitesi yok. “Yeni çıkan konseptler hakkında neler var? Martin Fowler en son neyden bahsetmiş? Go dilinde neler eklenecekmiş?Microsoft .NET Framework’e yatırım yapmay bırakacak mı?” vs. Bilhassa İngilizcesi iyi olan arkadaşların kolaylıkla yapabileceği bir şey.

* Üsttekine benzer ayrı bir düşüncem ise kurumsal firmalar için üretilebilecek ürünler. Hatta bunu birkaç kişi beraber geliştirip “startup”a da dönüştürebilir. Örneğin bir cache yapısı, log yapısı hatta bütün bir framework. Yine mesela bir “Deployment tool”. Halen Türkiye’nin en büyük bankalarından birinde geçen seneye kadar manuel deployment yapıldığını biliyorum ve asla bu konuda yalnız olduğunu zannetmiyorum. Yine örneğin finans sektöründe çalışmış birkaç kişi, çalıştıkları “business know-how”ıyla o konudaki bir ihtiyacı gideren ürünler tasarlayabilirler.

* Bunların dışında, maddi sıkıntı varsa biraz daha hızlı getirisi olabilecek özel ders piyasası da var(Özgür Yazılım Dünyası’nın affına sığınarak :))

Benim naçizane önerilerim bunlar. Söz konusu yazılım olunca yapılabilecek başka pek çok şey de vardır muhakkak. Yorumlar da katkılarınızı beklerim.

Yazıyı okuduğunuz için teşekkürler.

Allah iş arayışındaki herkese hayırlı rızık kapıları nasip etsin.

 Bu sayfa 424 kez görüntülendi

It's only fair to share...Share on LinkedInShare on FacebookShare on Google+Tweet about this on TwitterShare on Tumblr

C # 5 Caller Info Attributes Kullanımı ve Eski Versiyonlar İçin Bir Yöntem Önerisi

Merhabalar.

C# 5’te(yani .NET Framework 4.5’ta) gelen Caller Info özellikleriyle herhangi bir metodu nereden çağırdığımıza dair bilgilere erişebiliyoruz.

Bu da özellikle loglama ve izleme(örneğin SQL Server Profiler kullanımı) işlemlerinde büyük fayda sağlıyor.

Syntax şu şekilde :

public void NeredenGeldim(string parametre, 
                                             [CallerMemberName]string cagiranMetodAdi = "", 
                                             [CallerFilePath]string cagiranDosyaYolu = "", 
                                             [CallerLineNumber]int cagiranSatirNumarasi = 0)

Bu attributeleri şu şekilde açıklayabiliriz:
CallerMemberName: Bu metodun hangi metoddan çağırıldığı bilgisini,
CallerFilePath: Bu metodun çağırıldığı dosyanın dosya yolunu,
CallerLineNumber: Bu metodun çağırıldığı satır numarasını almamızı sağlar.

Örneklere başlamadan önce NOT: Resimleri üzerlerine tıklayarak büyütebilrsiniz.

Şu örneği inceleyerek oldukça basit bir kullanımı olduğunu görebilirsiniz:

static void Main(string[] args)
{
   MetodCagir();
}

private static void MetodCagir()
{
   NeredenGeldim("Bir metodun serancamı:");
}

public static void NeredenGeldim(string parametre, [CallerMemberName]string cagiranMetodAdi = "", [CallerFilePath]string cagiranDosyaYolu = "", [CallerLineNumber]int cagiranSatirNumarasi = 0)
{
   Console.WriteLine(parametre);
   Console.WriteLine("Çağıran Metodun Adı : " + cagiranMetodAdi);
   Console.WriteLine("Çağıran Metodun Dosya Yolu : " + cagiranDosyaYolu);
   Console.WriteLine("Çağıran Metodun Satır Numarası : " + cagiranSatirNumarasi);
   
   Console.Read();
}

Çıktı:

Buraya kadar her şey güzel. Ama .NET Framework’ün eski versiyonlarında bu “attribute”leri kullanamıyoruz. Bunun için yapabileceğimiz şey tüm versiyonlarda bulunan aslında fazlasıyla aşina olduğumuz bir sınıfı kullanacağız: StackTrace!

İlk etapta eski versiyonlar için metodu oluşturalım:

public static void NeredenGeldimEskiVersiyonlar(string parametre, string cagiranMetodAdi = "", string cagiranDosyaYolu = "", int cagiranSatirNumarasi = 0)
{
   StackTrace st = new StackTrace(true);
   StackFrame[] frames = st.GetFrames();

   Console.WriteLine(parametre);
   Console.WriteLine("Çağıran Metodun Adı : " + cagiranMetodAdi);
   Console.WriteLine("Çağıran Metodun Dosya Yolu : " + cagiranDosyaYolu);
   Console.WriteLine("Çağıran Metodun Satır Numarası : " + cagiranSatirNumarasi);
 
   Console.Read();
}

Burada StackTrace’in her bir “frame“i aslında hata mesajlarında gördüğümüz satırları ifade ediyor ve aşağıdaki gibi gözüküyor:

İncelediğimizde içinde bulunduğuz metoddan başlayarak hiyerarşik bir şekilde metodların “frame” dizisinde listelendiğini görüyoruz.

Gördüğünüz gibi olay “Caller Info Attributes”teki kadar kolay değil. Geldiğimiz metodu tespit etmek için bir şekilde dizinin elemanlarını bir şekilde filtrelememiz lazım.

Bunun için de “frame”lerin içeriğine biraz daha yakından bakalım. Örneğin bizim aradığımız metod olan “MetodCagir“ı içeren “frame”i inceleyelim:

Burada “Frame“in altında “DeclaringType“ı ve onun “property“leri arasında ise “Name” ve “FullName” alanlarını görüyoruz. “FullName”den yararlanarak metodumuzu çağıran programı filtreleyebiliriz. Örneğimizde hepsi “MerhabaDunya.Program” olsa da kurumsal programlarda pek çok farklı proje entegre bir şekilde çalıştığı için farklı isimler bulunabilir bu kısımda.

Bu yüzden ilk etapta bir LINQ sorgusuyla “FullName”e göre filtreleyip neler olduğuna bakıyorum.

“frames” değişkenin atamasını güncelleyelim:

StackFrame[] frames =
 st.GetFrames()
 .Where(s => s.GetMethod().DeclaringType.FullName.Contains("MerhabaDunya.Program"))
 .ToArray();

Örneğe göz atmadan önce bir NOT: Bu arada ben LINQ sorgusu kullanacağım için .NET Framework 3.5 da çalıştırıyorum programı. LINQ sorgusuna ihtiyacınız yoksa daha alt versiyonlarda da bu yöntemi kullanabiliyorsunuz.

Şimdi debug modda “frames”e bakalım tekrar:

Görüldüğü üzere 3 metod kaldı. (Bu da demek oluyor ki dışarıda kalan 4 metod programımıza değil .NET Framework’e ait metodlardı.)

Bu metodlar da sırasıyla:

  • NeredenGeldimEskiVersiyonlar(İçinde bulunduğumuz metod)
  • MetodCagir(Metodumuza çağıran, asıl aradığımız metod)
  • ve Main metodu.

Artık filtreleme yaptığım sorguya bir şart daha ekleyerek aradığım “frame”e ulaşabilirim:

“Metod ismi ‘NeredenGeldimEskiVersiyonlar’ olmayan ilk ‘frame’i getir ve bilgilerini yazdır.”

Yazıyı daha fazla uzatmadan kodun son haline bakalım:

public static void NeredenGeldimEskiVersiyonlar(string parametre, string cagiranMetodAdi = "", string cagiranDosyaYolu = "", int cagiranSatirNumarasi = 0)
{
   StackTrace st = new StackTrace(true);
   StackFrame[] frames = st.GetFrames();
   StackFrame frame = new StackFrame();

   if (frames != null)
   {
      frame = frames.FirstOrDefault(s => s.GetMethod().DeclaringType.FullName.Contains("MerhabaDunya.Program") && s.GetMethod().Name != "NeredenGeldimEskiVersiyonlar");
      cagiranMetodAdi = frame.GetMethod().Name;
      cagiranDosyaYolu = frame.GetFileName();
      cagiranSatirNumarasi = frame.GetFileLineNumber();
   }
 
   Console.WriteLine(parametre);
   Console.WriteLine("Çağıran Metodun Adı : " + cagiranMetodAdi);
   Console.WriteLine("Çağıran Metodun Dosya Yolu : " + cagiranDosyaYolu);
   Console.WriteLine("Çağıran Metodun Satır Numarası : " + cagiranSatirNumarasi);

   Console.Read();
}

Ve çıktı:

Gördüğünüz üzere aslında C# 5’te hayatımıza giren bir çözüme eski versiyonlarda ulaşmak için bir “workaround” çözüm geliştirdim. Tahmin edeceğiniz üzere bu gerçek hayatta karşılaştığım bir problemi aşmak için bulduğum çözüm. Bundan daha temiz bir çözüm de olabilir elbette. Benden şimdilik bu kadar.

Kendinize çook iyi davranın.

 Bu sayfa 409 kez görüntülendi

It's only fair to share...Share on LinkedInShare on FacebookShare on Google+Tweet about this on TwitterShare on Tumblr