Friday, November 28, 2014

Difference between a hobby project and a product

One of the most important lessons an engineer learns is that a going from a demonstration prototype (i.e. "hobby project") to a product that other non-engineer people can use requires a lot of additional work. I would say that prototype to product transition requires as much work as creating the protoype.

A product
  • is well tested and can work under a wide range of conditions (this is the main cost difference because additional testing reveals previously unknown weaknesses and will force you to make major design changes)
  • anticipates internal errors / environmental anomalies and has mechanisms in place to recover gracefully
  • anticipates user error and guides the user when he does something wrong
  • has an intuitive user interface (i.e. people don't need to ask an engineer how to operate it)
A novice thinks he almost has a product when he demonstrates basic functionality. The wise one knows that he has only covered half the distance.

Friday, November 21, 2014

Improving java.awt.Polygon contains() method

The contains() method in java.awt.Polygon, which checks if the input coordinate is inside the boundary, might not return true for all the points that you would expect. Example: xPoints = {0, 5, 10, 15, 15}, yPoints = {0, 5, 3, 10, 0}. With the standard Polygon class, contains(5,5), contains(15,10), contains(15, 0) all return false although these points are on the polygon (indicated by arrows in the figure below). If you use Matlab's inpolygon function you will get true for all of them.


The reason is related to the "insideness" definition. A point is considered to lie inside a Shape if and only if:
  • it lies completely inside the Shape boundary or
  • it lies exactly on the Shape boundary and the space immediately adjacent to the point in the increasing X direction is entirely inside the boundary
  • or it lies exactly on a horizontal boundary segment and the space immediately adjacent to the point in the increasing Y direction is inside the boundary.
I have written ImprovedPolygon whose contains() method returns true for the above cases by checking if the input coordinates lie on the edges of the polygon using the line formula y = m*x + n and limits of the line end points. Both ImprovedPolygon and its unit test class ImprovedPolygonTest can be downloaded from GitHub here.

Listening to: Take me to Church - Hozier

Monday, November 17, 2014

Java: Information hiding using interfaces

Typically, the "private" key word is used to hide any methods/attributes from other classes. However, there are cases where a class has one set of methods that is used by class A and another set of methods that are used by class B which means that all these methods have to be public. To prevent class A from accessing methods meant for class B, we can use interfaces as depicted in the following example:


Wednesday, July 23, 2014

Tips for software integration

I have been involved a couple of times in software development efforts where my small module (~20 KLOC) had to be integrated into a larger module (~1 MLOC).
Complicating factors:
  • It was not possible to install the larger module on my development environment. There was no offline version.
  • Interface Control Document (ICD) did not exist or was out of date the minute it was written because the larger module was also in development.

Friday, June 06, 2014

The path of the autodidact

I like learning, be it a new computer algorithm or political history. My problem is that I spend a lot of time looking around, sampling information from different domains but not being able to focus and get deeper. Since I am in need of depth to feel happy about a topic, I always feel that there is something missing. I watch lots of YouTube videos and I am enrolled (but have never finished) in dozens of online courses. There is no end to sampling in this age of easy access to all sorts of information. Since September 2012, I have a second job, namely being a father, which does not leave any time for prolonged concentration.

My plan: Sample for 6 months, then in the final two weeks, decide on what to focus on (at most 2 things). Take a week of off from job and get down and dirty. If it is related to programming, create a working application. Make sure there is a babysitter during the day, i.e. father time = mainly evenings and weekends.

Saturday, May 03, 2014

Başka bir okul mümkün

Geçen hafta Başka Bir Okul Mümkün Derneği'nin Ankara'da Eylül ayında açacağı ilokulun tanıtım etkinliğine gittik. Sağolsun, Gonca Hn bizimle ilgilendi. Ken Robinson'un TED konuşmasından ilham alarak çevresindeki insanlarla böyle bir oluşuma girmişler. Okulun yeri İncek'te. Daha önce Melek İpek İlköğretim okulu olan binayı 10 yıllığına kiralamışlar. Veliler derneğe/kooperatife üye oluyorlar, yani okulun sahibi veliler. MEB'e bağlı özel okul statüsünde olacakmış.

Eylül için hedefleri 30 öğrenci. Max kapasite 100. Sınıfların 20 kişi olmasını, sınıf başına bir sınıf öğretmeni bir de yardımcı öğretmen olmasını düşünüyorlar.

Hoşumuza gitti, takipçisi olacağız. Yarın (4 Mayıs) Tunalı Otel'deki toplantıya da gideceğiz.

Güncelleme, 4 Mayıs 2014: Toplantıya gittik. Maksadımız Ankara kooperatifinin üyeleri hayal dünyasında yaşayan hippi tipler mi, yoksa ayağı yere basan, ne yaptığını bilen insanlar mı diye görmekti. Kısacası gördüklerimizden memnun kaldık, hepsi güzel insanlardı.

Hafta boyunca izlediğim videolardan derlediğim soru ve cevaplar:

Soru: Milli eğitim müfredatı ile uyumlu musunuz?
Cevap: Evet. Milli eğitimde verilmek istenen kazanımlar var. Bu kazanımlar normal okullarda fiziksel şartların yetersizliği nedeniyle verilemiyor. Biz bu şartları sağlayarak zaten verilmek istenenleri daha etkili bir şekilde verme imkanına sahibiz. Örneğin milli eğitimde öğrenci konseyi kavramı var ancak öğrenci sayısının fazlalığı nedeniyle uygulanamıyor. Biz sayıyı bu tür şeyleri uygulayacak seviyede tutuyoruz.

Soru: Velilerin rolü ne?
Cevap: Veliler kooperatifin ortağı, yani okulun sahibiler. Okulda çocuğu olmayan birisi ortak olamaz, ancak bağış yapabilir. Yani veliler normal okullara göre çok daha sahiplenici bir konumdalar.

Soru: Açılan okullarla derneğin ilişkisi ne?
Cevap: Okulları çocuklarını okula gönderecek veliler açıyor. Dernek onlara sadece yol gösteriyor, eldeki bilgi birikimini paylaşıyor. Okulların yönetimi tamamen kooperatiflerin elinde.

Soru: Öğretmenleri nasıl seçiyorsunuz?
Cevap: Milli eğitimin kriterlerine uygun adaylar arasından seçiyoruz. Detay şurada.

Soru: Ya çocuk birşey öğrenmezse?
Cevap [Bodrum'daki okula çocuğunu yollayan bir veliden]: Çocuğun ilkokulda öğreneceği temel konular okuma yazma ve dört işlem. En kötü durumda, yani okul bunları öğretmede yetersiz kalsa bile ebeveyni olarak ben öğretirim. Çocuğumun sağlıklı bir sosyal çevrede çocukluğunu yaşaması, öğrenme heyecanını kaybetmemesi çok daha önemli.

Soru: Çocuklar okuldaki ideal şartlar yüzünden toplumdan kopuk hale gelebilirler mi?
Cevap: Mevcut okulların hayatla iç içe olduğunu iddia edebilir miyiz? Biz hayat bilgisi derslerini dışarıda, örneğin pazaryerinde işliyoruz. Bir gezimizde çöplüğe gittik, dönüşte çocuklar neden bazı insanlar çöplüğü karıştırmak zorunda diye sordular. Kitapların ötesindeki gerçek hayatı daha yakından tanıma fırsatı buluyorlar.

Kaynaklar:

Friday, April 04, 2014

Returning objects in C++

I recently discovered that returning an object in C++ might not be what you expect. I was surprised because in Java things would be different. Consider the following code:


getClassB() returns the mClassB attribute. Class B is as follows:


I wrote the following main function to test results:


I thought that a.getClassB().setVal(1) would set mClassB.mVal to 1. But when I read it using a.getClassB().mVal I got a meaningless number hinting that mVal was not set.

When I set the result of a.getClassB() to ClassB b and then set b.setVal(2) and read b.mVal I get 2 as expected.

Finally, when I use a.getClassBReference()->setVal(4) and then read it using a.getClassBReference()->mVal, I get 4.

I think that a.getClassB() returns a copy of mClassB which means that a setVal() operation on that copy does not modify a.mClassB.mVal. If you want to modify an field of an object attribute, the getter of that attribute has to return a reference, not a copy.