Thread overview
Bir proje geliştirilirken algoritma geliştirme aşaması
Oct 17, 2017
İbrahim
Oct 18, 2017
İbrahim
Oct 18, 2017
kerdemdemir
Nov 09, 2017
Salih Dinçer
October 17, 2017

Selamün Aleyküm;

İş yerlerinde çalışan veya ekiple geliştirilen projelerde çalışan yazılımcı arkadaşlara soruyorum. Bir iş yerinde proje için istenilen algoritma ne kadar sürede hazırlanmalı? Yani projede sizden bir bölümün algoritmasının hazırlanması ve kodlanması istenildiğinde o algoritmayı ne kadar sürede tamamlamanız gerekiyor? Bunun için sizden bir süre isteniyor mu? Algoritmayı geliştirmeniz için ne kadar süre harcıyorsunuz? Tabii ki de bunlar aslında göreceli kavramlar ama merak ettiğim şey basit algoritmalar (mesela girilen 12li AM/PM saat formatını 24lü saat formatına dönüştürme gibi) için bile uzun uzun, belki de saatlerce düşündüğünüz oluyor mu? Ben bir sitedeki bu saat dönüştürme algoritmasını hazırlıyordum ve gerçekten böyle basit bir algoritma için 2 - 2,5 saat düşündüm, nasıl yapayım diye. Aslında çok kolay ama aşırı gereksiz kod olmasın diye kısa yolları da düşündüm. Merak ettiğim iş yerlerinde daha zor algoritmalar istenecektir, bunları ne kadar sürede ve ne kadar efor sarfederek geliştiriyorsunuz? İş yeri bu algoritma için size süre tanıyor mu? Diyelim ki algoritmayı geliştiremedik, sonucu ne olur? İş yeri zarara girer mi? Bir de iyi düşünülmüş algoritmalar benzeri tanımlar yapılıyor, bir algoritmanın beğenilecek ve iyi olacak seviyede olmasına nasıl karar veriliyor?
Mesela şu 2 koddan hangisi neye göre daha iyidir?:

#include <iostream>
#include <string>
using namespace std;

std::string time_conversion(const std::string& time)
{
 // We can parse time as "hh", ":", "mm", ":", "ss", "AM/PM"
 std::string hh, mm, ss, format, format24hours("");
 hh.assign(time, 0, 2);
 mm.assign(time, 3, 2);
 ss.assign(time, 6, 2);
 format.assign(time, 8, 2);

 int h = stoi(hh),
     m = stoi(mm),
     s = stoi(ss);

 if (format == "AM")
 {
   if (0 <= h && h <= 12)
     format24hours += (h < 12) ? ((h < 10) ? "0" : "") + std::to_string(h)
                               : ((h == 12) ? "0" : "") + std::to_string(h - 12);
   format24hours += ":";
   if (0 <= m && m <= 59)
     format24hours += ((m < 10) ? "0" : "") + std::to_string(m);
   format24hours += ":";
   if (0 <= s && s <= 59)
     format24hours += ((s < 10) ? "0" : "") + std::to_string(s);
 }
 else if (format == "PM")
 {
   if (0 <= h && h <= 12)
     format24hours += std::to_string((h + 12 >= 24) ? (h % 24) : h + 12);
   format24hours += ":";
   if (0 <= m && m <= 59)
     format24hours += ((m < 10) ? "0" : "") + std::to_string(m);
   format24hours += ":";
   if (0 <= s && s <= 59)
     format24hours += ((s < 10) ? "0" : "") + std::to_string(s);
 }

 return format24hours;
}

int main()
{
 std::string time;
 cin >> time;
 std::string result(time_conversion(time));
 cout << result << endl;

 return 0;
}
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

int main() {
   string s;
   string h;
   int hr;
   cin>>s;
   hr = ((s[0]-'0')*10)+(s[1]-'0');
   if(s[8]=='P'&&s[9]=='M'&& hr ==12) cout<<to_string(hr);
   else if(s[8]=='P'&&s[9]=='M') cout<<to_string(hr+12);
   else if(s[8]=='A'&&s[9]=='M'&&hr==12) cout<<"00";

   else cout<< s[0]<<s[1];


   for(int i =2;i<8;i++)
       cout<<s[i];
   cout<<endl;
   return 0;
}

Teşekkürler.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

October 17, 2017

Alıntı (İbrahim):

>

Bir iş yerinde proje için istenilen algoritma ne kadar sürede hazırlanmalı?

Senin de söylediğin gibi, bazen baştan belli olamaz.

Alıntı:

>

Yani projede sizden bir bölümün algoritmasının hazırlanması ve kodlanması istenildiğinde o algoritmayı ne kadar sürede tamamlamanız gerekiyor?

Deneyimlere bağlı olarak kaba fikir edinilebilir ama en iyisi işe başlayıp görmek. :)

Alıntı:

>

mesela girilen 12li AM/PM saat formatını 24lü saat formatına dönüştürme gibi) için bile uzun uzun, belki de saatlerce düşündüğünüz oluyor mu?

Oluyor ama ben baştan düşünme konusunda çok iyi değilim. Çok şeyi ancak kodlamaya ve diğer programlarla etkileşmeye başladıkça görüyorum. Sanırım aslında çoğu programcı da öyle.

Verdiğin saat örneği fazla küçük ama genelde bir requirements document (beklentiler belgesi; ne başarılması gerekiyor) yazıyoruz. Ondan sonra genellikle onu çözecek olan kişi (örneğin ben) bir design document yazıyor. Bu belgede "şu program diğerine A yanında şimdi bir de B de vermeli", "diğer programa şöyle bir struct ve şöyle bir komut eklemeliyiz" gibi bilgiler oluyor.

Ondan sonra Jira (bir kaç hafta önce Trello bile kullandık) gibi bir programla (siteyle) o tasarımın alt adımlarını listeliyoruz: "Falanca program B bilgisini edinmeli ve A'nın yanına onu da eklemeli", "filanca program B'yi taramalı", "yine filance program B'deki bilgiye göre şu dosyaya yazmalı" gibi asıl programlama adımlarını oluşturuyoruz.

Sonra önümüzdeki haftaya (veya iki haftaya) o adımlardan hangilerini sığdırabileceğimizi düşünüyorsak onları "bu haftaki işler" (örneğin, Sprint 42) bölümüne alıp kodlamaya başlıyoruz. (Jira gibi programlar bu işlemleri kolaylaştırıyorlar.)

İşin kötüsü (aslında normali), kodlama aşamasında tasarımdaki eksiklikleri farkediyoruz: "B'yi edinemiyorum çünkü o diğer programın henüz C'den haberi yok" gibi sorunları çözmek için tasarım ve biraz kodlama değişiyor.

Alıntı:

>

2 - 2,5 saat düşündüm, nasıl yapayım diye. Aslında çok kolay ama aşırı gereksiz kod olmasın diye kısa yolları da düşündüm. Merak ettiğim iş yerlerinde daha zor algoritmalar istenecektir, bunları ne kadar sürede ve ne kadar efor sarfederek geliştiriyorsunuz?

Bu deneyimle de çok ilgili, değil mi? Evet, kafamda bir çok yöntem düşündüğüm oluyor ama bunların çoğunu önceki deneyimlere göre eliyorum.

Alıntı:

>

İş yeri bu algoritma için size süre tanıyor mu?

O cümlene biraz yorum yapmak istiyorum çünkü Türkiye'de daha fazla olduğunu düşündüğüm sağlıksız bir ilişkiyi akla getiriyor. Aslında iş yeri diye bir üst varlık olmamalı. Hatta, iş yeri bile senin için. Var olan şey, bir grup insanın bir sorunu çözme durumunda bulunmaları. Saat düzeninin değiştirilmesi gerekiyor, toplantıda, yemekte, veya çayımızı koyarken bu konuyu konuşuyoruz ve çözüm daha önce kimin yazdığı kodla ilgiliyse o kişiye "İbrahim, abicim o yazdığın koddaki saatlerin 24 saat formatında olması gerekiyormuş" deniyor. Benim etkin olduğunu düşündüğüm ilişki bu. Yoksa bir iş veren robot gibi "bip, bu algoritma 1 saat yazılır, bip" demiyor. :)

Alıntı:

>

Diyelim ki algoritmayı geliştiremedik, sonucu ne olur? İş yeri zarara girer mi?

Çare tükenmez ama geliştirememe olayı belirli bir kişi yüzündense ve tabii daha önce de benzer şeyler yaşanmışsa, o kişinin işine son verilir ve kendisi daha mutlu olacağı başka bir yere gider. İş yeri de zarar girer ama o kadar önemli değil.

Alıntı:

>

Mesela şu 2 koddan hangisi neye göre daha iyidir?:

Normalde aklımıza bin bir kıstas getirerek kodladığımızdan her satırın üzerinden geçemem ama bana ikisi de çok garip geldi çünkü std:string'lerle oynuyorlar. Ben olsam giriş string'ini Saat diye bir struct oluşturmak için kullanır ve o nesneyi 24 saat düzeninde yazdırırdım.

Belki de öyle yapmalarının önemli bir nedeni vardır. O zaman koda bir açıklama satırı eklemeleri iyi olurmuş. Ama doğrusu, ikisi de bana rahatsız edici geldi. :)

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

October 18, 2017

Alıntı:

>

Bu deneyimle de çok ilgili, değil mi? Evet, kafamda bir çok yöntem düşündüğüm oluyor ama bunların çoğunu önceki deneyimlere göre eliyorum.

Alıntı:

>

Normalde aklımıza bin bir kıstas getirerek kodladığımızdan her satırın üzerinden geçemem ama bana ikisi de çok garip geldi çünkü std:string'lerle oynuyorlar. Ben olsam giriş string'ini Saat diye bir struct oluşturmak için kullanır ve o nesneyi 24 saat düzeninde yazdırırdım.

Belki de öyle yapmalarının önemli bir nedeni vardır. O zaman koda bir açıklama satırı eklemeleri iyi olurmuş. Ama doğrusu, ikisi de bana rahatsız edici geldi. :)

Aslında bu saat sorusu HackerRank'e ait: https://www.hackerrank.com/challenges/time-conversion
Orada da illaki std::string kullanın denmemiş fakat editörde hazır std::string olduğu için sanırım C++ kısmında herkes de std::string kullanmış. İlk iletimde verdiğim 2 koddan ilki de bana ait :). O kodda da olduğu gibi ben çok basit şekilde düşündüm. Kısaca std::string'i al, saat, dakika, saniye ve saat biçimi olarak parçala ve gerekli işlemi yap. Neden olduğunu bilmiyorum ama ben sanki hep algoritmanın en kolay ve acemice olan tarafını düşünüyorum :). Diğer kodlamalara baktığımda çok ilginç şeyler görüyorum ve sanki benim yazdığım kod o kişilerinkinin yanında acemice duruyor gibi geliyor. Mesela bana bir dizi karakterle ilgili işlem yap deseler aklıma ilk olarak o karakter dizisini "dizinin 0. elemanını al, 1. elemanını al ..." şeklinde parçalamak geliyor. Ve bilmiyorum ama sanki o dizi sanki parçalanmadan işlem yapılamazmış gibi hissediyorum. Ardından bu, dilin özelliklerini yeterince iyi bilmediğim için mi oluyor bilemiyorum. Aynı şekilde bir asal sayı bulan algoritma yapmaya çalıştığımda aklımdan geçen ilk ve temelde hep aynı olan şey o sayıyı asal çarpanlarına bölerek bulmak geliyor ve tabii ki de bunun için bir for döngüsü gerekli diyorum. Görüldüğü üzere nedense algoritma oluştururken aklıma en acemice yollar geliyor. Ya da bilmiyorum bana mı acemice geliyor.
Bir de siz o örnek için "std::string ile oynuyorlar" diyerek algoritmaları garip bulmuşsunuz. Ardından da "struct oluşturup o nesneyi de 24 saat düzeninde yazdırırım" demişsiniz. Aslında burada merak ettiğim 24 saat düzenine çevirirken nasıl bir algoritma kurulacağı. Acaba siz de mi özünde string'leri parçalayacaksınız? :)

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

October 18, 2017

Ibrahim merhaba,

Ben Ali Abinin dedigini soyle anladim;

struct ZamanFormati
{
int saat;
int dakika;
int saniye;
bool sabahMi;
};

char* timeConversion(char* s) {
ZamanFormati zaman;
zaman.sabahMi = s[strlen(s) - 2] == 'A';
sscanf(s, "%2d : %2d : %2d", &zaman.saat, &zaman.dakika, &zaman.saniye);
sprintf( s, "%02d:%02d:%02d", zaman.sabahMi ? zaman.saat % 12 : ((zaman.saat %12) + 12), zaman.dakika, zaman.saniye);
return s;
}

Burda C yerine C++ kullansaydim is daha uzardi. Her nekadar C++ kullanirken scanf ve sprintf gibi fonksiyonlardan kacinmak dogrusada eger boost,qt gibi yardimci kutuphaneler yoksa std'nin string gibi siniflari cok zayif kaliyorlar. Yani bunu C++ cok seven biri olarak soyluyorum aslinda ama bir split fonksiyonu yok bir endswith fonksiyonu yok.

Yukardaki kod D de yazilsaydi tek satirda biterdi is herhalde, split fonksiyonu filan kullanilirdi hem guvenilir hem guzel olurdu.

Saygilar
Erdemdem

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

October 18, 2017

Alıntı (İbrahim):

>

ben çok basit şekilde düşündüm

Doğru yapmışsın çünkü doğru çalışan program için en önemli özelliklerden birisi basitliktir.

Alıntı:

>

benim yazdığım kod o kişilerinkinin yanında acemice duruyor gibi geliyor

Öyle de olabilir sana da öyle geliyor olabilir. İkisi de deneyimle ilgili. ;)

Alıntı:

>

bir asal sayı bulan algoritma yapmaya çalıştığımda

Gerçek hayatta çoğu durumda bunların hiçbirisini sen yazmıyorsun çünkü genellikle çok etkin olarak yazılmış algoritmalar var.

Alıntı:

>

siz o örnek için "std::string ile oynuyorlar" diyerek algoritmaları garip bulmuşsunuz

Soruyu görmeyince öyle gelmişti. Böyle bir konu gerçek programda gerekse zaten mevcut bir Saat türü vardır ve ortalıkta string'ler değil, Saat nesneleri dolaşır. Olasılıkla o türün dizgiden okuma ve dizgiye yazma işlevleri vardır. O yüzden benim kafam o tarafa kaymış.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

November 09, 2017

Merhaba İbrahim, soruların en normalinden sorular ve eminim tecrüben arttıkça her şey daha bir kolay gelecek sana.

İş yerinde olaylar nasıl oluyor diye sormuşsun; muhtemelen bir ekibe dahil olmayı düşünüyorsun. Sorabilir miyim ne kadar tecrüben var. Örneğin tüm veri yapılarını biliyor musun, matematiğin nasıl?

Kolay gelsin...

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]