Forum: Diğer Konular RSS
Bir proje geliştirilirken algoritma geliştirme aşaması
İbrahim #1
Üye Eki 2015 tarihinden beri · 156 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Bir proje geliştirilirken algoritma geliştirme aşaması
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.
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
İ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.

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. :)

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.

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.

İş 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. :)

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.

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
İbrahim #3
Üye Eki 2015 tarihinden beri · 156 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
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.
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? :)
kerdemdemir #4
Üye Eyl 2013 tarihinden beri · 123 mesaj · Konum: Danimarka
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
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 mesaj 2 defa değişti; son değiştiren: kerdemdemir; zaman: 2017-10-18, 06:18.
acehreli (Moderatör) #5
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #3
İ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.

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. ;)

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.

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
Avatar
Salih Dinçer #6
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
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...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-19, 20:02:55 (UTC -08:00)