Bir programcıysanız, kendinizi bir "bilgisayar bilimcisi" olarak düşünmeyin; bilgisayar bilimcileri, doğru malzeme karışımı, minyatürleştirme ve hesaplama teorisi elde edilene kadar bazıları hala bilim kurgu olan yeni nesil bilgisayarları yaratanlardır. Bunlar sadece boru hattının başlangıcıdır. Burada ve şimdi yazılım geliştiren insanlar "yazılım mühendisleri" dir; teorik ve araçları, bazen pratik teoriyi ve gerçek dünya araçlarını üst üste yerleştirerek, bu karmaşık elektinik sihirbazlık parçasının potansiyelindeki gücü kullanmak ve istediğimizi yapmasını sağlamak için alıyorlar. Bu, bilgisayar bilimcilerinin teorilerini alıp, donanım ve yazılımı gerçek dünyadaki son kullanıcı elektronik çözümlerine uygulayan "bilgisayar mühendisliği" alanının bir uzmanlığıdır.
Burası, iş dünyasının teoriyle buluştuğu IMO'dur. Bu tür durumlarda, "daha iyinin düşmanı yeterince iyidir" eski atasözü "yeterince iyinin düşmanı daha iyidir" okumak için kolayca döndürülebilir. Kendinizi bir "bilim adamı" yerine bir "mühendis" olarak görmek ve yaptıklarınızı diğer mühendislik disiplinlerine paralel koymak, farklılıkları rahatlatır.
Diyelim ki bir inşaat mühendisi / inşaat mühendisi size geliyor ve bir köprü inşa etmenizi istiyor. Köprünün 20 feet'e yayılması, kendini ve bir ton taşıma yükünü desteklemesi gerekiyor, rutin bakım ile 10 yıl sürmeli ve bir ay içinde 20.000 $ karşılığında istiyorlar. Bunlar sizin kısıtlamalarınızdır; maksimumları aşmamakla birlikte minimumları karşılar. Bunu yapmak "yeterince iyi" ve maaş çeki alır. Golden Gate Köprüsü'nü inşa etmek, hem tasarım özelliklerini hem de bütçeyi birkaç büyüklükte aşan çok kötü bir mühendislik olurdu. Genellikle maliyet aşımlarını yiyor ve zaman aşımları için ceza ödüyorsunuz. Ayrıca, zaman ve malzeme olarak sadece 1000 dolara mal olmasına rağmen, 5 yetişkin erkeğin ağırlığı için bir halat köprüsü inşa etmeniz de kötü bir mühendislik olacaktır; iyi müşteri yorumları ve referansları almazsanız,
Yazılıma geri dönersek, gelen dosyaları sindirmek ve bilgileri sisteme koymak için oluşturulmuş bir dosya işleme sistemine ihtiyaç duyan bir müşteriniz olduğunu varsayalım. Bir hafta içinde yapılmasını istiyorlar ve günde beş dosya, yaklaşık 10 MB değerinde veri işlemek zorundalar, çünkü şu anda aldıkları tüm trafik bu. Değerli teorileriniz büyük ölçüde pencereden dışarı çıkar; göreviniz bu özellikleri bir hafta içinde karşılayan bir ürün oluşturmaktır, çünkü bunu yaparak müşterinin maliyet bütçesini de karşılayabilirsiniz (malzemeler genellikle bu boyuttaki bir yazılım sözleşmesi için kovada bir düşüş olduğu için). İki haftayı, kazancın on katına bile harcamak bir seçenek değildir, ancak büyük olasılıkla, iki kopyanın çalışması talimatıyla birlikte, verimin sadece yarısını işleyebilecek bir günde oluşturulmuş bir program da değildir.
Eğer bunun bir yan dava olduğunu düşünüyorsanız yanılıyorsunuz; bu çoğu ev içi çalışanın günlük ortamıdır. Nedeni yatırım getirisi; bu ilk programın maliyeti fazla değildir ve bu nedenle çok hızlı bir şekilde ödeme yapar. Son kullanıcılar daha fazlasını yapmak veya daha hızlı gitmek için buna ihtiyaç duyduklarında, kod yeniden düzenlenebilir ve ölçeklendirilebilir.
Programlamanın mevcut durumunun arkasındaki ana sebep budur; bilgi işlem tarihinin tamamından doğan varsayım, bir programın ASLA statik olmadığıdır. Her zaman yükseltilmesi gerekecek ve sonunda değiştirilecektir. Buna paralel olarak, programların üzerinde çalıştığı bilgisayarların sürekli iyileştirilmesi, hem teorik verimliliğe daha az dikkat çekilmesini hem de ölçeklenebilirlik ve paralelleştirmeye (N-kare zamanında çalışan, ancak N çekirdeğinde çalışacak şekilde paralelleştirilebilen bir algoritma) artan ilgiyi sağlar. doğrusal görünür ve genellikle daha verimli bir çözüm tasarlamak için daha fazla donanım maliyeti geliştiricilerin maliyetinden daha ucuzdur).
Bunun da ötesinde, her geliştirici kodu satırının yanlış gidebilecek başka bir şey olduğu çok basit bir ilke vardır. Bir geliştirici ne kadar az yazarsa, yazdığı şeyin bir sorunu olması da o kadar az olasıdır. Bu kimsenin "hata oranına" yönelik bir eleştiri değildir; bu basit bir gerçektir. Bir MergeSort'u 5 dilde nasıl ileri ve geri yazacağınızı biliyor olabilirsiniz, ancak bir kod satırında sadece bir tanımlayıcıyı parmakla basarsanız, tüm Sıralama işe yaramaz ve derleyici onu yakalamazsa sizi alabilir hata ayıklamak için saat. List.Sort () ile bunu karşılaştırın; orada, genel durumda etkilidir ve işte en iyi şey, zaten çalışıyor.
Bu nedenle, modern platformların birçok özelliği ve modern tasarım yöntemlerinin ilkeleri, bu düşünülerek oluşturulmuştur:
- OOP - bir nesneye ilgili verileri ve mantığı oluşturun ve bu nesne kavramının geçerli olduğu her yerde, böylece nesne veya daha özel bir türetme.
- Önceden oluşturulmuş şablonlar - iyi bir% 60 veya daha fazla kod, sözdizimsel sarsıntı ve programın ekranda bir şey göstermesini sağlamanın temelidir. Bu kodu standartlaştırarak ve otomatik olarak oluşturarak geliştiricinin iş yükünü yarıya indirerek üretkenliğin artmasına izin verirsiniz.
- Algoritmalar ve veri yapıları kütüphaneleri - Yukarıda belirtildiği gibi, bir Stack, Queue, QuickSort, vb.'nin nasıl yazılacağını biliyor olabilirsiniz, ancak tüm bunları içeren bir kod kütüphanesi olduğunda neden yapmanız gerekiyor? Bir web sitesine ihtiyaç duyduğunuz için IIS veya Apache'yi yeniden yazmazsınız, bu yüzden neden birkaç harika uygulama olduğunda bir QuickSort algoritması veya kırmızı-siyah ağaç nesnesi uygulayalım?
- Akıcı arayüzler - Aynı satırlar boyunca, kayıtları filtreleyen ve sıralayan bir algoritmaya sahip olabilirsiniz. Hızlı, ama muhtemelen çok okunabilir değil; küçük geliştiricinizin, kayıt nesnesindeki ek bir alanda sıralamak için gereken cerrahi değişikliği yapmasına izin vermek yerine, onu anlamak için bir gün sürecektir. Bunun yerine, Linq gibi kütüphaneler, nesnelerin listesini filtrelenmiş, sıralanmış, yansıtılmış nesnelere dönüştürmek için çok çirkin, genellikle kırılgan bir kodun bir veya iki satır yapılandırılabilir yöntem çağrısı ile değiştirilir.