Java 8 Sertifikasyonu (OCAJP 8) – Bölüm 0: Giriş

Java 8 sertifikasyon sınavına (OCAJP 8) hazırlanırken aldığım notlardan derlemelerimi içeren yazı dizisine hoş geldiniz. 5 yıldan uzun süredir Java programlama dili ile geliştirme yapan birisi olarak burada paylaşacağım notlar haliyle daha çok “highlights” (önemli noktalar) tadında olacak.

java8-logo

Lafı uzatmadan…

OCAJP 8 nedir?

  • Açılımı “Oracle Certified Associate, Java SE 8 Programmer”.
  • Oracle Sun’ı satın almadan ve kapsamını bölerek iki ayrı sertifikasyon programı haline getirmeden önceki adı “Sun Certified Java Programmer (SCJP)” olan sertifikasyon programının birinci aşaması.
  • Java’nın temel/görece basit konularının ele alındığı bu programın bir büyüğü ise OCAJP 8 (Oracle Certified Professional, Java SE 8 Programmer)
  • Bu iki program da Java SE konularını kapsamaktadır ve Java EE ile ilgili sertifikasyon programlarının ön koşuludurlar.
  • Kapsamı, giriş ücreti (şu sıralar 612 TL / 210$ civarı) ve sınav merkezi lokasyon bilgisi için (Türkiye’de pek çok test merkezi mevcut): http://education.oracle.com/pls/web_prod-plq-dad/db_pages.getpage?page_id=5001&get_params=p_exam_id:1Z0-808

OCAJP 8 konuları?

Yukarıda paylaştığım linkte de bulabileceğiniz konu başlıklarını buraya ufak açıklamalar eşliğinde ekledim:

  • Java Basics:
    Değişkenlerin kapsamları (scope of variables), bir Java sınıfının (class) yapısı, “main” metodu ve çalıştırılabilir (executable) Java uygulamaları…
  • Working With Java Data Types:
    Java veri tipleri, ilkel tipler (primitive data types), nesne (object) referans değişkenleri ve ilkel tip değişkenler arasındaki farklar, nesne yaşam döngüsü…
  • Using Operators and Decision Constructs:
    Operatörler, karar yapıları (if, switch…), eşitlik kontrolü (== ve equals())…
  • Creating and Using Arrays:
    Bir ve çok boyutlu diziler oluşturma ve kullanma…
  • Using Loop Constructs:
    Döngü yapıları (for, while, do+while), döngü yapılarının karşılaştırması, “break” ve “continue” anahtar kelimeleri…
  • Working with Methods and Encapsulation:
    Metotlar, kapsülleme (encapsulation) yani sınıfın iç işlerini dış mihraklardan gizleme, “static” anahtar kelimesi…
  • Working with Inheritance:
    Kalıtım (Inheritance), soyut (abstract) sınıflar, arabirimler (interfaces), çok biçimlilik (polymorphism), “casting”, “this” anahtar kelimesi, üst sınıf davranışını ezme (overriding)…
  • Handling Exceptions:
    İstisna (Exception) yönetimi, “try-catch” blokları, “checked” ve “unchecked” istisnalar arasındaki farklar, temel istisna tipleri: “NullPointerException”, “ArithmeticExcpetion”, “ArrayIndexOutOfBoundsException”, “ClassCastException”…
  • Working with Selected classes from the Java API:
    “String”, “StringBuilder”, “java.time.LocalDateTime”, “java.time.LocalDate”, “java.time.LocalTime”, “java.time.format.DateTimeFormatter”, “java.time.Period”, “ArrayList” gibi temel Java API sınıfları ile çalışma, basit Lambda deyimleri yazabilme…

Gördüğünüz gibi OCAJP 8’in pek çok konu başlığı bir Java programcısının (hatta pek çok programcının) ekmeği suyu olan konular. Peki neden hazırlık yapmaya ihtiyaç var? Çünkü bu bir sınav ve doğası gereği kısıtlı bir zaman diliminde (150 dakika) sorulan soruların (77 adet soru) belli bir kısmını (%65’lik bir kısmını) doğru cevaplamamız istenmekte. Bunun için de ilgili konuların kafamıza net bir şekilde oturmuş olması ve soruları şak diye cevaplayabiliyor olmamız gerekmekte.

OCPJP 8 ise, günlük hayatta çokta dikkat etmediğimiz “Thread” gibi kavraması daha güç bir çok konuyu kapsamakta. Yani OCAJP 8’i atlattığımızda asıl macera bizi orada bekliyor olacak. :)

Neden sertifikasyon?

  • Birincil sebep:
    Yıllardır kullandığım bu programlama dilini gözümden kaçan, gündelik hayatta kullanmadığım (çoğu zaman alışkanlıklarımıza uygun şekilde, neredeyse ezbere diyebileceğimiz yöntemlerle kodlama yaparız) fakat faydalı olabileceğini keşfettiğim özellikleri ve konseptleriyle birlikte tam olarak kavramak, ve tabiki bunları sizlerle paylaşmak.
  • İkincil sebep:
    Neye faydası olur bilmiyorum ama, öz geçmişime bir satır daha eklemek. :)

“Systems Thinking”, yine mi sen!

Son aylarda katıldığım yada internetten izlediğim sunumlarda sıkça rastlamaya başladım “Systems Thinking” (Sistem Düşüncesi) kavramına. Biri “Hangi Agile?”, biri “Strategic Growth Hacking”, bir diğeri “One Hacker Way” başlıklı sunumlarda, hiç beklemediğim anda bu kavram çıkıverdi karşıma.

İlki Erik Meijer’in “One Hacker Way” sunumuydu:

Erik Meijer sunumunda bir noktadan itibaren matematiğin öneminden konuya girip Computer Science ve “Systems Thinking” (Control Theory) ilişkisini anlatmaya başlıyor, ve üniversitelerin Computer Science bölümlerinde neden “Systems Thinking” konusunun anlatılmadığından yakınıyor. Özetle; yazılımların geri bildirim döngüleri (feedback loops) ışığında geliştirilirlerse başarılı olabileceklerini söylüyor.

Sonraki, İTÜ Çekirdek’te katıldığım “Strategic Growth Hacking” sunumuydu. Kılıçhan Kaynak uzun yıllar Amerika’da yaşamış, girişimler kurmuş ve batırmış (kendi ifadesiyle) birisi. Sonra oturup düşündüğünde ve araştırdığında aradığı cevabı “Systems Thinking” yaklaşımında bulmuş. Sonra bu birikimini “The Spaghetti Startup: A Tale of Startup Survival or How to Achieve Radical Growth with Systems & Design Thinking” adlı kitabı yazarak ve girişimcilere/girişimci adaylarına sunumlar yaparak paylaşmak istemiş.

(Sunum sırasında İTÜ Çekirdek tarafından kayıt yapılıyordu ancak videosunu maalesef bulamadım.)

Son sunum ise dün akşam izlediğim “Hangi Agile?” başlıklı sunum oldu. Abdulkadir Yaman sunumun hemen başlarında “Neden Agile yapıyoruz?”u anlamak için “Systems Thinking” bilmemiz gerekir diyince bu bloğu yazmam şart oldu diye düşündüm. :)

(Sunumu organize eden Istanbul Coders grubuna teşekkürü borç bilirim.)

Konuşmacıların ortak söylemleri şöyle:

  • Her şeyi sistem olarak değerlendirebiliriz. Her şeye, mesela evliliğe bile sistem olarak yaklaşırsanız, daha mutlu olursunuz. :)
  • Sistemlerdeki geri bildirim döngülerini iyi anlamalıyız. Örneğin TDD (Test Driven Development) yazılımcının yazdığı kodun çalışıp çalışmadığıyla ilgili en hızlı şekilde geri bildirim almasını sağlayan bir geri bildirim döngüsü barındırır.
  • Sistem bileşenleri arasında bilgi akışı (information flow) sağlanmalı.

Dün akşam izlediğim sunumdan sonra artık “Systems Thinking” üzerine okumalar yapmaya başlamanın zamanı geldi de geçiyor diye düşündüm. Ve buna Kılıçhan Kaynak’ın “The Spaghetti Startup…” kitabıyla başlayacağım gibi görünüyor: http://lasagnac.com/

Redis Sertifikasyonu

Redis açık kaynak bir veri yapısı saklama çözümüdür/sunucusudur. “In-memory”dir, hızlıdır, ölçeklenebilir… kısaca candır.

redis-white

Dahili olarak List, Set, Hash, Sorted Set gibi veri yapılarını destekler, bunların üzerinde işlem yapabileceğiniz fonksiyonlar sunar. Pek çok dil için istemci kütüphanesi mevcuttur. Örneğin Java için Jedis tercih edilebilir. Jedis metot isimlerini Redis’teki fonksiyon isimleriyle benzer olacak şekilde belirlediği için, terminalden Redis istemcisinde veri yapılarını ve fonksiyonları biraz kurcaladıktan sonra hızlıca Java uygulamanızda kullanmaya başlayabilirsiniz.

Redis’in resmi dokümantasyonunu oldukça beğeniyorum: http://redis.io/documentation. Ancak benim gibi önce genel konsptlerden bahseden webiner ya da çevrimiçi video kurslarla başlamayı seviyorsanız sizleri Okumaya devam et

Java ve Apache Commons Email Kütüphanesi ile Gmail Hesabından E-posta Göndermek

Java ile e-posta göndermek istiyorsanız standart Java Mail API yerine onun kullanımı basitleştiren Apache Commons Email kütüphanesini kullanmak yerinde olacaktır.

Aşağıdaki bağımlılığı pom.xml’imize ekleyerek işe başlayalım:

<dependency>
   <groupId>org.apache.commons</groupId>
   <artifactId>commons-email</artifactId>
   <version>1.4</version>
</dependency>

Kütüphanenin bu yazıyı okuduğunuz andaki güncel versiyonunu öğrenmek için: http://mvnrepository.com/artifact/org.apache.commons/commons-email

E-posta gönderimini gerçekleştirebileceğiniz kodumuz ise şu şekilde:

Email email = new SimpleEmail();
email.setHostName("smtp.gmail.com");
email.setSmtpPort(587);
email.setSSLOnConnect(true);
email.setAuthenticator(new DefaultAuthenticator("ufukuzun.ce@gmail.com", "** Gmail parolanız **"));
email.setFrom("ufukuzun.ce@gmail.com");
email.addTo("ufuk.uzun@hotmail.com");
email.setSubject("Test Subject");
email.setMsg("Test Message");
email.send();

DefaultAuthenticator kurucusuna kendi Gmail bilgilerinizi girmelisiniz.

Örnek e-posta içeriğim düz metin (“Test Message”) olduğu için Email nesnesi olarak bir SimpleEmail sınıfı örneği kullandım. E-posta içeriğiniz HTML içerik olacaksa basitçe HtmlEmail sınıfını örneklemelisiniz.

Her şey güzel ancak çalıştırdığınızda şöyle bir hata mesajı ile karşılaşacaksınız: Okumaya devam et

Uzaktan Çalışmak (Remote Working)

Projenin başlamasının birinci ayından itibaren dahil olduğum n11.com ailesine 2 yıl 9 ayın ardından geçen ay veda ettim.

Ve geçen haftadan itibaren Infoowl‘da çalışmaya başladım. Infoowl’ın gayet eğlenceli ve bol “context switch”li bir çalışma tarzı var. Bolca yeni şeyler deneyip gerçekleştiriyoruz.

Infoowl’da çalışmanın diğer bir güzel yanı ve bu yazıyı yazma sebebim ise uzaktan çalışabilme kültürü. Eğer yapacağın işler belliyse ve müşteriye değmen gereken durumlar yoksa evden çalışabilme esnekliğin var. Geçen Perşembe ve Cuma günleri evdeydim. (Elbette yöneticimin teşvikiyle)

İstanbul trafiği düşünüldüğünde uzaktan çalışmak adeta bir nimet. Fakat benim gibi daha önce uzaktan çalışma tecrübeniz yoksa evde çalışırken konsantre olmakta zorluk yaşayabilirsiniz. Bu duruma kendimce bir çözüm buldum. Çözümüm çok basit; 8 saatten geriye sayan bir sayaç kullanıyorum. Sabah kalkıp çalışmak üzere masama oturduğumda sayacı başlatıyorum, ve her mola verdiğimde sayacı duraklatıyorum. Tekrar çalışmaya başladığımda ise devam ettiriyorum. Sayacın varlığı çalışmam gerektiğini bana hatırlatıyor, böylece konsantrasyonum çabucak dağılmıyor. Sayacı sürekli görmem gerekmiyor. Zaten öylesi sıkıcı ve daha dikkat dağıtıcı oldurdu sanırım. Dikkat edilmesi gereken tek nokta her molada sayacı duraklatmayı unutmamak. Bunun sayesinde öğle arasında film izlemek istediğimde film bittikten sonra kaç saat daha çalışmam gerektiğini biliyorum. 8 saatlik çalışma maratonum bittiğinde ise iş verenime karşı sorumluluğumu yerine getirdiğim için vicdanımın rahat oluyor.

Infoowl’daki uzaktan çalışma sürekli değil, bahsettiğim koşullar sağlandığında mümkün olan bir esneklik. Ancak ülkemizde ve dünyada “sürekli” uzaktan çalışmayı destekleyen firmalar da var:

Türkiye’den (benim bildiklerim, umarım başkaları da vardır)

  • Startup Kitchen: Önceden Tart New Media adıyla anılan firma önce ismini Startup Kitchen yaparak yeni bir yapılanmaya gitti, daha sonra ofisi mofisi kapatarak tümüyle uzaktan çalışma modeline geçti. SlideShare’deki şu sunumları ile uzaktan çalışmanın nasıl mümkün olabileceğini ve uzaktan çalışmalarının nedenlerini güzelce özetlemişler. Sunumda bahsi geçen bir kitap var: Remote – Office Not Required. Yukarıdaki basit çözümümün ötesine geçip biran önce bu kitabı okusam iyi olacak sanırım.
  • Enver Altın‘ın şurada bahsettiği çalışma modeli. Startup Kitchen gibi bu modelde de çalışmak isteyenlerin ek iş olarak yapmasına sıcak bakılmıyor. Uzaktan çalışmanın bir güzelliği olarak farklı illerden çalışmak mümkün hale geliyor. Ayda bir iki kere düzenlenecek yüzyüze toplantılarda farklı illerden çalışanlar da unutulmamış: “ayda en az bir-en cok iki defa guzel bi yerde yuzyuze toplaniyoruz, gelebilirseniz iyi olur ama sart degil (uzaktan geliyorsaniz yol masraflarinizi karsiliyoruz).”

Dünya’dan

  • teamed.io: Daha önce şu yazıda bahsetmiştim. CV’niz ile başvuruyorsunuz. Size saat ücreti bazında bir teklifte bulunuyorlar ve kabul ederseniz size atanan ısındırma “issue”su ile kodlamaya başlıyorsunuz. Size atanan işler saat üzerinden puanlanmış durumda. Örneğin iş “3 saatlik” diye belirlenmişse siz işi teslim ettiğinizde (ve yaptığınız geliştirme kabul edildiğinde) siz gerçekte kaç saatte tamamlamış olursanız olun (elbette bir son teslim tarihi var) size saatlik ücretiniz çarpı 3 kadar bir ücret ödeniyor. Ücretlendirme bu şekilde olduğu için ek iş olarak da yapmanız mümkün. Son olarak, kod kalitesine çok önem veriyorlar. Hatta teamed.io kurucusunun açık kaynak projeler için para ödüllü (4096 dolar) bir “kod kalitesi yarışması” dahi var: http://www.yegor256.com/award.html. teamed.io’ya Türkiye’den başvuran ve kabul edilen bir kaç tanıdığım var. Saatlik ücret olarak 30 dolar teklif aldılar.
  • Stack Overflow Jobs yurtdışında iş arıyorsanız oldukça güzel bir başlangıç noktası olabilir. Arama yaparken “Allow Remote” kriterini seçili hale getirirseniz uzaktan çalışma imkanının da olduğu ilanlara çabucak erişebilirsiniz.

Java’da Multithreading – Bölüm 13: Threadlerin Yarıda Kesilmesi (Interrupting)

Bu zamana kadar ki örneklerimizde “InterruptedException” istisnası ile sıkça karşılaştık. Bu istisna bir threadin çalışması yarıda kesildiğinde fırlatılır. Peki çalışmakta olan bir threadin çalışması nasıl yarıda kesilir? Gelin yaptığı işlem uzun süren bir threadi belli süre geçtikten sonra durdurmayı deneyelim. Bunun için “Thread” sınıfının sağladığı “interrupt()” metodunu kullanacağız:

public class Application {

    public static void main(String[] args) throws InterruptedException {
        System.out.println("Başladı.");

        Thread t = new Thread(() -> {
            for (int i = 0; i < 1E8; i++) {
                Math.sin(new Random().nextDouble());
            }
        });

        t.start();

        Thread.sleep(500);

        t.interrupt();

        t.join();

        System.out.println("Bitti.");
    }

}

Programın çalışması bittiğinde çıktısının şu şekilde olduğunu göreceksiniz: Okumaya devam et