So far, I’ve touched or been familiar with several programming language:

Some I familiar with are Java, Python, Julia

Some I’ve played are C/C++, Haskell, Matlab, R, Perl, Lisp, Prolog, javascript, php

And took a lesson of Programming Language and Software Engineering

Read lots of book about Software Engineering…

Recall the basic programming lesson you’ve took

The quiz or exam would always be:

What does **** stands for?

or

Please write down a program to ****

Just some what like that…

But!

If you pass these kind of quizes or exams, can you say that you can program in this programming language?

As my aspect, a good programmer must understand what compiler says.

That is, an excellent programmer must know what happened while the compile error is thrown out

And he must have the ability to deal with it.

An excellent programmer must know about what will compiler act.

An excellent programmer must know how to tune the perfromance.

An excellent programmer must familiar with the basic syntax without the help of IDEs.

An excellent programmer must have some basic concept about hardware, at least the machine you’re using.

So…

If you think that you become an excellent programmer after taking some lessons of one language
And you cannot do above of these.

Well…

It’s still a long way to go.

留言與分享

自從在雙主修時修了軟體工程之後,一直受益於這個領域,而且最近也會看一些軟體工程的書。

覺得軟體工程強調的是彈性

彈性

  • 可擴充性 (scalability):如何設計系統讓系統在擴充功能或是應用範圍變大的時候變得簡單
  • 可移植性 (portability):如何設計系統讓系統在不同的環境中也能夠順利運作
  • 低耦合性及高內聚性 (low-coupling and high-cohesion):如何設計系統讓系統內部的模組 (module)之間具有此項特質

可擴充性

就像是一個建築師可以好好的完成一間小屋子。

但是他有沒有辦法把小屋子延伸成摩天大樓?

或是已經完成的屋子能不能在添加其他的功能上去?

可移植性

同樣一張小屋子的設計圖,是否可以在不同的環境下建出同樣的屋子?

在沙漠中?在冰原中?在高山中?

如果可以,稱為可移植性。

低耦合性

小屋子當中的各個房間有不同的功能。

各房間通常是打通的呢?或是隔開的?

最好是不要把房間的功能都混在一起。

像是想在廚房看書然後就把廚房放個書櫃。

明明書櫃就該放在書房的,為什麼會出現在廚房。

或許可能會覺得這樣對使用者比較方便。

但是在軟體工程的角度來說,這是不好的示範。

高內聚性

小屋子當中相同功能性的東西最好都放在同一個房間比較好。

這個是相對於低耦合的良好示範。

那如何去決定哪些功能該跟哪些功能放在一起。

這就是工程師該去傷腦筋的了。

留言與分享

又在一次偶然的情況下接觸了MBTI的測試
想起很久一前作過一次
發現這次做出來結果不大一樣

這次:

似乎是成為學者的料的感覺 名人居然是有名的Albert Einstein
"思考者"或是"建築師"的形容很符合我的網誌標題呢(笑

附上之前測試的結果:
之前的結果(ENFJ)
維基百科_INTP
維基百科_ENFJ

似乎除了N以外其他都翻盤了是吧= ="
轉性轉很大呢XD

留言與分享

自從接觸 java 之後,修了資訊安全,開始寫了些密碼學的東西。
其中很多可以藉由 java 的物件導向概念讓程式更為強健、不紊亂。
這算是小筆記,先介紹物件導向的概念(沒有附程式碼也沒有圖)。


物件導向程式設計

1. 封裝(encapsulation)

在物件導向的概念中第一個講的一定是封裝。
當我今天要寫一隻龜兔賽跑的模擬程式。
在以往的結構化程式中大概會把 race()run() 等等動作寫成一個函式。
至於跑了幾秒、速度各是多少等等就會把這些參數寫到 main() 當中。
物件導向提供了不一樣的方法來描述這個問題。
物件導向最主要提供的是相近於人類的思考方式
然而在軟體工程觀點,物件導向最大的優點是程式碼的重複利用(code reusability)
我們可以把烏龜當成一個物件,對這個物件描述他的屬性(attribute)跟方法(method)。
屬性可以是烏龜跑步的速度、烏龜的名字或是烏龜的成績等等。
只要是關於烏龜的特性都可以藉由定義成屬性加以使用。
方法則是描述烏龜的行為,他可以是 run()rush()isWin() 等等。
run() 可以讓烏龜開始賽跑,rush() 可以讓烏龜進行衝刺,用 isWin() 來看烏龜是否贏得比賽等等。
等到我們把屬性及方法都定義好之後就要進行封裝。
到這裡我要來介紹一個原則,要依據這個原則進行封裝。

2. 最小權限原則(Principle of least privilege)

當我們把物件的屬性跟方法定義好之後,物件是需要與程式互動的。
所以程式以可能會需要用到物件的屬性或是方法,但是直接存取物件的屬性是危險的。
因為我們不知道什麼時候物件的屬性會遭到外界竄改而發生錯誤。
所以在這裡引用最小權限原則的原文:

Every program and every privileged user of the system should operate using the least amount of privilege necessary to complete the job. – Jerome Saltzer

「在每個程式跟系統的使用者應該使用最小的必要權限去完成工作」
換言之,物件要開放讓其他人存取的東西應該是最少且必要的,如此才能保障物件內部的運作可以順利,免於受到外界程式修改屬性的影響。
所以通常會把物件的屬性設成私有(private),將方法設成公開(public)。
當然這只是通常的作法,物件應該視不同情況需求有所變動。
那如果某天我想要存取物件的屬性怎麼辦?
我們會設一個 setter 跟一個 getter 的方法,利用 setter 去對某屬性加以設定,利用 getter 去得到屬性的值。
與原本直接存取屬性不同是,我們可以在 setter 中加入限制,以防輸入錯誤的值。
像剛剛的烏龜的速度 speed,可以藉由 setSpeed() 去限制烏龜的速度在什麼範圍。
要是烏龜的速度被設成跟飛機一樣快那不是糟了。
同樣可以寫一個 getSpeed() 去得到烏龜的速度。
如此一來,其他程式在使用烏龜這個物件的時候就不必考慮到內部的運作。

3. 類別(class)

當我們把烏龜寫好,他會被 java 存成一個類別。
外界程式會經由宣告這個類別,將烏龜變成一個實例(instance),我們可以叫他小龜。
我們可以藉由這種方式將很多的烏龜實例加以宣告,造出很多的烏龜,有紅的、有藍的(誤)。
所以類別只是描述烏龜這個物件的一個藍圖,真正將他宣告出來才能加以使用。

4. 繼承(inheritance)

繼承是物件導向當中一個重要的概念。
在表現上類似於生物的分類表,就像貓跟狗都是哺乳類一樣。
所以延續上面的例子,龜兔都是動物,所以龜兔都可以繼承自"動物"這個類別。
我們可以設計動物這個類別,他可含有名字這個屬性,也可以對他 get 或 set。
所以當烏龜或兔子類別繼承自動物的時候。
這時候我們說動物是烏龜跟兔子的父類別(superclass),烏龜就是動物的子類別(subclass)。
(在 C++ 中稱為基礎類別 base class 及衍生類別 derived class)
這時動物的屬性及方法就會被繼承到子類別中,如此可以避免重複的程式碼出現也好維護程式。
這時我們會說繼承關係是is-a關係,是一種關係。
也就是「烏龜**is-a(是一種)**動物」的關係,這也是重要的概念。

5. 多型(polymorphism)

來接續講講多型。
多型這個字的英文其實跟生物的物種多型性是同一個字。
生物的多型性是指同一物種當中的同一族群擁有兩種以上的表現型。
程式的多型也是如此,繼承於同樣的父類別下的子類別可以有不同的表現
就像之前的例子,動物類別可以有 run(),當烏龜跟兔子類別繼承了動物類別的 run()
烏龜的 run() 有自己的執行方式,兔子也是。
所以當需要執行烏龜自己的 run() 時,可以多型地使用,而不會繼承到動物類別的。
更進一步,可以將烏龜的 run() 及兔子的 run()相同的部份加以抽象化並提升到動物類別中。
以避免重複的程式碼,也好維護,同時可以達到多種表現的效果。
多型必須利用**覆寫(override)**父類別的方法來達到效果。
覆寫父類別的方法時,區塊內可以使用父類別的方法來加以建構。
多型當中還有很多的細節,我只在這邊做粗略的介紹而已。

6. 抽象類別(abstract class)及介面(interface)

到這邊為止應該是在程式設計上有點基礎之後的進階說明。
很多人一開始都會有疑問,抽象類別跟介面有什麼差別?
在語法上似乎是差不多的,抽象類別允許宣告抽象方法,介面的方法全是抽象方法。
其實還有很多,我就不贅述,但是在設計觀點,這兩者是不一樣的。
抽象類別仍然還是類別(class),所以他跟其他類別的關係是繼承關係,是is-a關係。
就像「烏龜是一種動物」一樣,動物是抽象的概念,可被寫成抽象類別。
但介面並不一樣,介面跟其他類別的關係是實現(realization),是契約關係
他會規範其他類別遵守介面定下的標準,必須要實作介面的抽象方法
舉個例,鳥會飛,飛機也會飛,但是鳥跟飛機是不同的東西,也不會繼承於相同的父類別之下,所以我們可以寫一個"會飛的"介面,這個介面定義抽象方法 fly()
當鳥與飛機都實現"會飛的"介面時,就必須要把 fly() 實作為具體方法(concrete method)。
所以鳥跟"會飛的"介面的關係是has-a (擁有, 會)
這兩者在設計概念上是不同的。

物件導向設計原則

7. 單一職責原則(single responsibility principle)

接下來講講物件導向設計(OOD)中著名的 SOLID 原則。
第一個 S 就是單一職責原則。
這個原則很簡單,他是說一個類別只要有一種職責(功能)就好
有時候工程師會追求一個類別的強大加了許多附加的功能。
這會使得這個類別難以維護,也失去類別的意義。
所以這個原則強調一個類別只要顧好他自己的職責所在,有簡單而呼應職責的方法即可。
相對也避免單一職責分散在各個類別中。
最極端的例子就是,集各種功能為一身的上帝類別(God class)。

8. 開放封閉原則(open/closed principle)

第二個 O 指的是開放封閉原則,直接引用原文:

Software entities (classes, modules, functions, etc.) should be open for extension, but closed for modification. – Bertrand Meyer

在軟體的類別、模組、函式中應該對擴充開放,而對修改關閉
每當我們要將既有的軟體中加入新的功能,我們應該是將新的元素加入而不是修改既有的程式碼讓他擁有新的功能。
修改會讓程式碼變得越來越龐雜,加入並延伸是讓軟體具有更多的小部份各自運作。
軟體具有這樣的特性的同時,也遵守單一職責原則會讓軟體更好。

9. 芮氏替換原則(Liskov substitution principle)

Let $q(x)$ be a property provable about objects $x$ of type $T$. Then $q(y)$ should be provable for objects $y$ of type $S$ where $S$ is a subtype of $T$. – Barbara Liskov and Jeannette Wing

一開始就把抽象的原文拉進來,這是個關於抽象化的部份。
在敘述一個繼承關係的時候,子類別是一種父類別,所以子類別可以替換父類別被使用
將原文解釋一下: 假設 $S$ 是 $T$ 的 subtype,$x$ 是 $T$ 中的物件,$q(x)$ 是成立的,那對 $y$ 是 $S$ 的物件,$q(y)$ 也是成立的。
這是用來避免一些狀況,當有一個鳥的類別被老鷹類別及鴕鳥類別繼承。
通常鳥都會飛,所以我們在鳥類別中加入 fly(),但是鴕鳥卻不會飛。
這種狀況阻礙了多型的操作,鴕鳥無法飛,也無法 override 父類別的 fly()
比較好的作法是做一個"會飛的"介面,並讓會飛的鳥去實現,將鳥類別中的 fly() 移除。

10. 介面隔離原則(interface segregation principle)

在物件導向設計當中,介面(interfaces)提供了一個抽象化層,可以在提供概念上的解釋,同時避免依賴性的屏障。
物件的功能會隨需求越多,類別會越來越龐大,繼承的層數也會增多。
當底層的類別還要在被子類別繼承時,子類別會依賴於父類別的方法。
或許子類別並不會用到父類別的某些方法,這些方法會變成子類別的累贅。
這時應該定義新的介面,讓需要的類別去實現介面,這樣就不會有多餘的方法被繼承。
當然,介面所定義的方法也要盡可能的少,才能被廣泛的使用。

11. 依賴反轉原則(dependency inversion principle)

在傳統的應用架構中,低層次的模組被高層次的模組使用,進而構成一個複雜的系統。
在這種複合關係(composition)下,高層次的模組直接依賴於低層次的模組去執行一些任務。
這個時候低層次模組的依賴限制了高層次模組的重複使用性。
在這種情況下,為了使得高層次的模組不依賴於低層次的模組,規定:

  1. 高層次的模組不應該依賴於低層次的模組,兩者都應該依賴於抽象體
  2. 抽象體不應該依賴於具體細節,而具體細節則應該依賴於抽象體

12. Don’t repeat yourself(DRY)

接下來講講簡單的。
如字面上的意思一樣,盡量不要寫重複的程式碼

13. Keep it simple, stupid(KISS)

如以上縮寫,寫程式需要親親(誤),快結尾了不說笑XD
程式碼越簡單越"笨"越好。
當然並不是把簡單可以完成的工作使用了很多 if else 完成。
單一的函式只處理他"分內的工作"就好,不要去理外界需要什麼。

14. Program to an interface, not an implementation.

這算是一句至理名言。寫程式到了一定的程度之後,比起實作,更需要關注的是那些介面。
對介面的設計,比起對實作的設計要來得重要的多。

參考:PrinciplesOfOod

留言與分享

推薦個好網站~

16型人格職業性格測試

大家可以去測測看喔~

以下是我測出來的結果:


分析:您的性格類型是「ENFJ」( 教育家 )

溫情,有同情心,反應敏捷,有責任感。非常關注別人的情緒、需要和動機。善於發現他人的潛能,並希望能幫助他們實現。能夠成為個人或群體成長和進步的催化劑。忠誠,對讚美和批評都能做出積極地回應。友善、好 社交。在團體中能很好地幫助他人,並有鼓舞他人的領導能力。

ENFJ型的人熱愛人類,他們認為人的感情是最重要的。而且他們很自然地關心別人,以熱情的態度對待生命,感受與個人相關的所有事物。由於他們很理想化,按照自己的價值觀生活,因此ENFJ型的人對於他們所尊重和敬 佩的人、事業和機構非常忠誠。他們精力充沛、滿腔熱情、富有責任感、勤勤勤懇懇、鍥而不捨。

ENFJ型的人具有自我批評的自然傾向。然而,他們對他人的情感具有責任心,所以ENFJ型的人很少在公共場合批評人。他們 敏銳地意識到什麼是(或不是)合適的行為。他們彬彬有禮、富有魅力、討人喜歡、深諳社會。ENFJ型的人具有平和的性格與忍耐力,他們長於外交,擅長在自己的周圍激發幽默感。他們是天然的領導者,受人歡迎而有魅 力。他們常常得利於自己口頭表達的天份,願意成為出色的傳播工作者。

ENFJ型的人在自已對情況感受的基礎上做決定,而不是基於事實本身。他們對顯而易見的事物之外的可能性,以及這些可能性以怎樣的方式影響他人 感興趣。 ENFJ型的人天生具有條理性,他們喜歡一種有安排的世界,並且希望別人也是如此。即使其他人正在做決定,他們還是喜歡把問題解決了。

ENFJ型的人富有同情心和理解力,願意培養和支持他人。他們能很好地 理解別人,有責任感和關心他人。由於他們是理想主義者,因此他們通常能看到別人身上的優點。

您適合的領域有:培訓、諮詢、教育、新聞傳播、公共關係、文化藝術

您適合的職業有:

  • 人力資源培訓主任
  • 銷售經理
  • 小企業經理
  • 程序設計員
  • 生態旅遊業專家
  • 廣告客戶經理
  • 公關專業人士
  • 協調人
  • 交流總裁
  • 作家/記者
  • 非營利機構總裁
  • 雜誌編輯
  • 電視製片人
  • 市場專員
  • 社會工作者
  • 人力資源管理
  • 職業指導顧問
  • 心理咨詢工作者
  • 大學教師(人文學科類)
  • 教育學、心理學研究人員
  • 撰稿人
  • 節目主持人(新聞、採訪類)
  • 公共關係專家
  • 社會活動家
  • 文藝工作者
  • 平面設計師
  • 畫家
  • 音樂家

那我以後是不是要當老師阿~@@

如果要的話我想當大學教授^^

因為有自己的研究室

也可以教教書

還不錯~

生態旅遊業專家~

聽起來還不錯ㄟ

說真的我還蠻嚮往之前那個去大堡礁當生態導覽的工作的^^

畫家也可以(尤其是漫畫家)~

愛畫畫的我^^~


大家也把自己測完的結果複製貼上來喔~

留言與分享

Yueh-Hua Tu

目標是計算生物學家!
Systems Biology, Computational Biology, Machine Learning
Julia Taiwan 發起人


研發替代役研究助理


Taiwan