2013年11月11日 星期一

這陣子的開發心得



好的Source version control真的很重要,用到很鳥的(例如perforce)生命就是會浪費。

Maven 沒有incremental build實在很麻煩,有很多plugin應該要考慮把處理過程的中繼資料存起來,有改的才跑就好。

不跑integration test是省掉了一些時間沒錯,但專案一大每次重頭build還是等的很煩。

Jenkins是好東西。

GWT build 實在是浪費時間。

開發團隊一大,CI + DEV ENV就需要專人維護,而且這人還必須有經驗不能亂找,因為這人對環境的任何改進,都會直接乘到團隊的人數上。

測試真是門藝術,有些程式碼是照規矩寫,簡單檢查一遍邊界條件與異常狀況就收工了,有些測試程式碼甚至只有被執行一次的的價值。但常常一個系統最有價值的部分:扯上語言、扯上條件組合、扯上時間的,就很容易怎麼測都不是很敢保證東西在任何的合理輸入下都會對。這需要修行與案例討論。

User 方的品味與專注程度會根本性的決定成果的價值。

Code review很重要,review的人必須專心在模型可能的瑕疵與合理性上,被review的人則要對「如何有效的讓設計能被他人理解」負責...這實在超難,畢竟英文非母語,而到底是review的人心中有成見,還是被review的設計真的不夠好,這有時實在很難釐清。但被review的人是有責任去盡可能的把可以預先想到的其他設計分枝,在初始階段就先考慮過一遍的。畢竟從多個可能性裡選一個,跟一開始直覺想到的第一個就一路做下去,這絕對差很多。

跑Scrum 還是要大家都在同一間辦公室比較好,分成兩個地方實在打很多折扣。

Pair programming 是任何團隊開發絕對要優先考慮的方式,光是「兩個人一起做,所有的社交軟體的干擾就會消失掉」這點在現代就起碼給你增加了15%up的產出,其它像是知識分享,工作進程的人腦備援,旁觀者清,聚焦集中且有效率的時間區段延長等等。更重要的是透過這種方式才能逐漸瞭解其他人的思維模式,進而找出適當的分工方法。

2013年8月12日 星期一

Apache CXF 筆記

為啥要玩Apache CXF呢?簡單的說就是要從它跟Jersey之間挑一個來用,目標是用它作為Web Application的後端跟GWT 開發的前端(透過 Resty GWT)溝通使用。

至於為什麼不直接用GWT RPC呢?因為公司的Architects覺得GWT有點朝不保夕的感覺,他們希望如果哪天GWT死掉了,前端可以有機會一點一點的換成Javascript native implementation...我是覺得這有點異想天開啦,但是看他們好像有人有基於這種架構開發過還很舒服的樣子,我就不多說了,玩下去就知道。

Jersey 公司已經一堆人會了,也有人用過,於是我就自動請纓來Survey CXF了...雖然我覺得這玩意八成不會被接受(開玩笑,一堆人會就代表開發成本低、有默契,這玩意很多時候比架構重要)。

CXF的基本介紹

CXF 是 Apache Foundation 底下開發SOAP、JAX-WS、JAX-RS應用的一個較為現代化(?)的應用框架。 它支援了幾個重要的Feature:

JAX-WS Support

基於JSR 224的實現,不多廢話,這玩意很老,overhead 很重,但跟異質系統做資料交換且要確保資料型態的正確性還是得靠這個。

Spring Integration

CXF的核心在2.4版以前跟Spring緊密的接合在一起,2.4版後將Spring作為configuration的一種選項(但這是一個強力建議的選項,不用Spring...你得搞懂它的核心是由哪些部件組成然後自己組一個才行)。

Aegis & JAXB Data Binding

CXF 提供在"Databinding"層提供多種選擇,它所謂的Databinding指的是Object to Structured Text(XML, Json, etc...)之間的轉換。

JAX-RS(RESTful Services) Support

基於JSR 339的實現,這篇文章主要想要玩想要討論的東西。JSR 339還蠻新的(final release: 24 May, 2013),CXF還沒有很好的實現它,想單純玩JAX-RS2.0的建議用Jersey,畢竟Jersey是reference implementation,沒做好Oracle就該打屁股了。

Apache 2.0 Licensed

Apache 出品,當然是Apache 2.0 License。


開始一個新的CXF JAX-RS專案


學一個東西,當然先從它的文件與Sample Code開始(...這是指好的情況,有時候人品爆發,就會從看Code 開始)。CXF如果完全照它最簡單的設定走,其實還蠻簡單的,首先,讓我們用CXF所提供的maven archetype來generate 一個Eclipse Project。

如果用的是Eclipse + M2E來開發的,可以很簡單的用m2e的new maven project 來開始新專案,當中在選擇archetype時,建議用 catalog: http://repo1.maven.org/maven2/archetype-catalog.xml 下的cxf-jaxrs-service,來生成project,generate 出來的結果最有趣的部份在build區塊內,讓我們分段的來看一下它的內容:
   <plugin><!--get a random port from system -->
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>build-helper-maven-plugin</artifactId>
    <version>1.5</version>
    <executions>
     <execution>
      <id>reserve-network-port</id>
      <goals>
       <goal>reserve-network-port</goal>
      </goals>
      <phase>process-test-resources</phase>
      <configuration>
       <portNames>
        <portName>test.server.port</portName>
       </portNames>
      </configuration>
     </execution>
    </executions>
   </plugin>
   <plugin>
    <groupId>org.apache.tomcat.maven</groupId>
    <artifactId>tomcat7-maven-plugin</artifactId>
    <executions>
     <execution>
      <id>start-tomcat</id>
      <goals>
       <goal>run-war</goal>
      </goals>
      <phase>pre-integration-test</phase>
      <configuration>
       <port>${test.server.port}</port>
       <path>/jaxrs-service</path>
       <fork>true</fork>
       <useSeparateTomcatClassLoader>true</useSeparateTomcatClassLoader>
      </configuration>
     </execution>
     <execution>
      <id>stop-tomcat</id>
      <goals>
       <goal>shutdown</goal>
      </goals>
      <phase>post-integration-test</phase>
      <configuration>
       <path>/jaxrs-service</path>
      </configuration>
     </execution>
    </executions>
   </plugin>

可以看見這段是先利用build-helper-maven-plugin 先去取得一個OS上沒有用到的IP,然後存到變數test.server.port上,這樣之後tomcat7-maven-plugin要啟動tomcat7時,就有了一個適當的IP可以用了。

而Tomcat7-maven-plugin會在pre-integration-test phase做start up,然後在post-integration-test phase做shut down,這樣在integration-test phase 期間,unit test case執行的時候就有正確的環境可以執行,底下是maven跑integration-test 的設定:
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    <version>2.8.1</version>
    <executions>
     <execution>
      <id>integration-test</id>
      <goals>
       <goal>integration-test</goal>
      </goals>
      <configuration>
       <systemPropertyVariables>
        <service.url>http://localhost:${test.server.port}/cxf_demo2</service.url>
       </systemPropertyVariables>
      </configuration>
     </execution>
     <execution>
      <id>verify</id>
      <goals>
       <goal>verify</goal>
      </goals>
     </execution>
    </executions>
   </plugin>

像這樣的對continuous integration的友善支持,對以現代化開發流程為前提要選用framework來說,是很重要的。
像我一樣,跟Maven不很熟的朋友,建議看一下 Maven - Introduction to the Build Life-cycle,了解一下Maven會跑哪些步驟,你可以做些什麼。



CXF在Container裡面的設定

CXF 在Application configuration上,在2.4版以前是與Spring Framework耦合的,也就是說,你得給一份Spring的xml configuration。
在web.xml上,你有兩個方式可以apply這個設定:
宣告一個Spring的ContextListener

 <context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>WEB-INF/beans.xml</param-value>
 </context-param>

 <listener>
  <listener-class>
   org.springframework.web.context.ContextLoaderListener
  </listener-class>
 </listener>

或者,在CXFServlet 的宣告裡,透過init param 指定
<servlet>
 <servlet-name>CXFServlet1</servlet-name>
 <servlet-class>
  org.apache.cxf.transport.servlet.CXFServlet
 </servlet-class>
 <init-param>
  <param-name>config-location</param-name>
  <param-value>/WEB-INF/beans1.xml</param-value>
 </init-param>
 <load-on-startup>1</load-on-startup>
</servlet>

我並不是很喜歡採用一個web service方案的時候,還要被強迫在專案指定特定的DI framework,但我可以理解基於CXF的龐大與複雜度,一個適當的DI framework可以幫忙做很多骯髒活。
不過在Configuration DI 的Solution這個方面的選擇,個人認為Jersey做了一個比較漂亮的決定 - HK2 (HK2是一個相容於CDI、非常的輕量、一旦把作為一個組裝器的事情給做完,可以把後續移交給其他DI Container的DI framework)。
在2.4版之後,CXF開始將Spring從核心切割出去,想要開始一個不基於Spring做組裝的CXF核心,你可以在web.xml裡下這樣宣告:
<servlet>
 <servlet-name>NonSpringServlet</servlet-name>
 <servlet-class>
  org.apache.cxf.transport.servlet.CXFNonSpringServlet
 </servlet-class>
 <load-on-startup>1</load-on-startup>
</servlet>
簡單的說,不想要Spring就宣告個CXFNonSpringServlet(...這真的是很醜),這個Servlet 提供了一缸子的<init-param>給使用者客製化,大部分的值接受以換行符號或逗點分隔來給予多個參數(...這真的有夠醜,誰想要自己的web.xml被搞成這樣啊?)不喜歡這個作法的朋友,請create一個java class 去繼承CXFNonSpringServlet,事實上,目前的CXFServlet就是透過繼承它來實作的(也就是有地方可以給你挖Code、抄Code啦)。
於是,為了實現Google Guice + CXF,我自己實作了一個MyGuiceCXFJaxrsServlet.java:
public class MyGuiceCXFJaxrsServlet extends CXFNonSpringServlet {
 private static final long serialVersionUID = 4798627144134171969L;

 @Override
 public void init(ServletConfig servletConfig) throws ServletException {
  super.init(servletConfig);
  
  Bus bus = this.getBus();
  BusFactory.setDefaultBus(bus);

  JAXRSServerFactoryBean jaxrsFacBean = new JAXRSServerFactoryBean();
  jaxrsFacBean.setBus(getBus());

  
  // config OUT interceptors...
  configInInterceptors( jaxrsFacBean);
  
  // config IN interceptors...
  configOutInterceptors(jaxrsFacBean);
  
  // determine target jax-rs services
  configResources(jaxrsFacBean);
  
  jaxrsFacBean.setProvider(new JacksonJsonProvider());
  jaxrsFacBean.create();
 }
 /**
  * 
  * @param jaxrsFacBean
  */
 protected void configInInterceptors(JAXRSServerFactoryBean jaxrsFacBean) {
  List<Interceptor<? extends Message>> interceptors = 
    new ArrayList<Interceptor<? extends Message>>();
  
  interceptors.add(new JsonpInInterceptor());
  jaxrsFacBean.setInInterceptors(interceptors);
 }
 /**
  * 
  * @param jaxrsFacBean
  */
 protected void configOutInterceptors(JAXRSServerFactoryBean jaxrsFacBean) {
  List<Interceptor<? extends Message>> interceptors = 
    new ArrayList<Interceptor<? extends Message>>();
  interceptors.add(new JsonpPreStreamInterceptor());
  interceptors.add(new JsonpPostStreamInterceptor());
  
  jaxrsFacBean.setOutInterceptors(interceptors);
  
//  interceptors = new ArrayList<Interceptor<? extends Message>>();
//  interceptors.add(new FaultOutInterceptor());
//  jaxrsFacBean.setOutFaultInterceptors(interceptors);
 }
 /**
  * 
  * @param jaxrsFacBean
  */
 protected void configResources(JAXRSServerFactoryBean jaxrsFacBean){
  
  
  //TODO make this configurable...
  
  Injector injector = Guice.createInjector(new AbstractModule() {
   @Override
   protected void configure() {
    bind(User.class).toInstance(new User("Zanyking"));
    bind(CustomerService.class);    
   }
  });
  
  jaxrsFacBean.setResourceClasses(CustomerService.class);
  jaxrsFacBean.setResourceProvider(CustomerService.class, 
    new SingletonResourceProvider(
      injector.getInstance(CustomerService.class)));
 }
 
}
最主要將Guice與CXF接合起來的地方是在 ConfigResource(JAXRSServerFactoryBean) 這個method 的實作裡,我用Guice生成了一個基於jax-rs的CustomerService物件,給CXF去用。
對於想要直接custom一個CXF系統來用的情境,這個method的傳入參數:JAXRSServerFactoryBean的API就是關鍵,今天如果有人想要搞一個GuiceCXF還是WeldCXF,那需要的就是從這顆bean開始去挖CXF的架構來設計。
PS:其實,我還另外挖到一支 org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet ,它的介紹竟然只有這樣...這讓我感到很悲傷啊。

結論

我對於CXF感到不滿意的地方:
  1. JAX-RS 2.0的支援並不完全。應該說它還沒做完,在目前version 2.7.6,CXF並不支援javax.ws.rs.client.Client(我下了3.0.0-SNAPSHOT來看,看來未來它會把API都接好,但目前這個snapshot玩下去功能整個不會動是爛的...悲劇),你得用它的專屬WebClient API來撰寫測試。
  2. Documentation關於NonSpring這段的使用不完整且不友善,沒doc也就算了,沒sample code就很糟糕了,大部分的使用案例得要開發者看著Spring bean.xml去自己腦內翻譯成none spring version。

我對於CXF感到滿意的地方:
  1. 如果你喜歡XML configuration、Spring就是你的菜,那CXF太棒了。
  2. 出了很久,所以會發生的問題、範例、效能調整之類的東西,該解的都解了,如果用出問題,比較高的機會是開發者自己的問題。
  3. Maven有給archetype,這不是什麼了不起的玩意,但它有做。
雖然我想在目前跑的專案上,因為這玩意還不完全支援JAX-RS2.0,而且XML configuration對於專案成員來說也不是特別偏愛(都在用Guice了,你可以想見有很高的機率有人是XML hater)所以大概要出局,但若要我給這個產品一個分數,我想她還蠻OK的,基礎架構設計非常的java classic,當初開架構的沒有為了跟風亂搞什麼太fancy的東西結果四不像,一旦搞懂它的模型,設定上就四平八穩。
可見的未來它可能得遭遇一段陣痛期,我認為它得做好的工作有:
  • JAX-RS2.0 Compliant:沒啥好說,越快支援越好,還不支援的每天它都正在流失客群。
  • 去把跟其他DI的部份整好:不是誰都想用Spring的,而照顧其他DI framework使用者的需求不是一句:『自己去看Code』就結束的,做solution survey會真的挖下去看code的開發者可沒想像中那麼多。
  • 網站本身Doc的水準有待加強:我知道Apache是Open Source Java界的丐幫(專案武林最多、組織最大、什麼千奇百怪的需求都照顧),但一個向上爬、積極爭取眼球的專案最重要的就是doc與sample code,有很多外人幫你試出好的用法不代表你就不用去整理。

不曉得有多少人在用CXF?有在用的、或有什麼其他關於CXF的問題的朋友,歡迎回應。

2013年5月30日 星期四

看維根斯坦-語言的誤用?

維根斯坦說:我可以感覺到疼痛,但我不會『知道』自己正在疼痛,要能用『知道』這個詞,那必須有『不知道』的空間才可以。
也就是『我知道A』這句話要合理,必須在『我不知道A』也可以合理成立時才行。

可是,當我感到痛的時候(也就是痛正發生於我身上某個部位並為我所感知的當下)我雖然可以說『我知道我感到痛』,但『我不知道我感到痛』這句話有存在的空間嗎?

沒有的,所以這告訴我們,自身的疼痛對自己來說並不屬於知識論的討論範疇,也就是使用『我』這個主詞,『知道』這個動詞在『我的疼痛』這個受詞上,是語言的誤用。

所以,維根斯坦反對的並不是人可以知道自己的疼痛,他反對的是人說出這句話。在他看來,說出這句話,就表示這個人缺乏對『自己的疼痛』在語言使用上的局限性,而把『知道』給誤用了。有趣的是,『我不知道你在痛』這句話是成立的,也就是說,他人的疼痛對自己來說卻是知識。

這告訴我們語言裡主詞、動詞、受詞的結構,其實是有著更多邏輯上的限制的,而維根斯坦從這邊出發,揭露了許多哲學討論有著語言基礎上的邏輯謬誤,例如從笛卡兒以降,有名的心物二元說。

維根斯坦可以說是後世哲學家的文法老師,從此哲學討論的字詞使用得要更加小心才行。

2013年5月29日 星期三

一些關於管理的想法

最近逐漸意識到,也許管理最重要的,就是讓所有的人都能聚焦,都能以理性做基礎,在一個有限的時間資源裡,去相信並追求組織目標的實現。

而這之中最重要的,就是讓實現目標所必須的各個方向都有適當的人選,這些人,要能根據其他人的需求去思考:
『我這邊要怎麼做,才可以把誰在做的什麼東西給撐起來?』
『我要根據誰的什麼反應來判斷我的工作是否有成效?』
這類問題之所以重要,是因為價值一向是外部決定(不然就球員兼裁判了),透過觀察、行動、回饋,你才比較能相信自己工作的價值。而成就也將驅使你做出更好的貢獻。
(這也是為什麼人們喜歡玩遊戲,因為遊戲的回饋一向是外部、立即、且明確的。)

從更高的地方鳥瞰,這也表示所有方向上的工作,一定都會因為組織的目標而在某個點發生強相依性,這個相依性發生的地方,也就是介面,是團隊成員行動上要有效果、溝通上要有效率的最重要關鍵。

我們都對這個『強相依性的部份』有共識,溝通才會有默契,也才能找到做什麼是對的,以及該如何評估有沒有做好。

但實際上... 我覺得包括我在內,台灣的職場環境大家普遍的都很懶,都懶於去問問題,都懶於去界定清楚到底那個強相依性是什麼、在一個目標下我們每個人工作的本質是什麼,甚至很多人從基礎上就認為這個問題不重要。

我們從自己的職務名稱出發,透過對這個職務的想像來框住自己的行為,但到底這對整個組織、團隊的價值是什麼呢?人畢竟不是規格化的零件,但卻被規格與名稱給迷住了。

於是所有人最後都迷失在『經驗所訴說的嚴酷環境現實』裡,忘記其他人、把自己隔絕起來、對組織運作的了解停留在個人印象、不再相信可以實現的可能性而開始追逐局部效益、短期價值,於是組織不效率、僵化發生、於是變化不是轉機而是危機。



2013年5月25日 星期六

學校教育的本質問題

學校這個組織,是為了教『所有』學生而存在,不是為了教好『每一個』學生而存在。這個本質,必然會在每個人獨特性、學習方式、性向培育上造成不效率與失敗。

說到底,所謂國民基礎教育,就是想將『沒有標準化』原物料也就是學生,灌輸『規格化』知識與思想一個工業化過程。這樣過程必然是會有篩選機制,也就是學生會被分出『適合這樣教』、與『不適合這樣教』兩群。

這樣生產架構,如果不從教育角度看,從工業工程與生產管理角度看,是1908 ~ 1927年之間福特生產T型車流水裝配線水準,9年國教就是一條巨大裝配線,從進料到出廠,整個過程要走9年。

這條裝配線,一旦9年國教變成12年,那就是一條:
『繼續生產T型車,不過要多花3年加一些其他標準功能』生產線。

所有人應該都可以理解這條生產線不符合『現代需要』,但有誰能開出不一樣流程規劃與藍圖呢?

這就是國民教育走工業化單一流水線裝配生產本質困境。
以前學校、老師與社會家長之間,很清楚的存在著一個以『上好學校與未來出息成極高正相關』作為價值思想基礎的市場經濟運作模式。於是學校(或者說工廠)為了競爭排名、老師為了成為名師,可以『開除』學生,家長想讓小孩上好學校,就把小孩送去補習班,而聯考是國家為了『高階國民製程』中的QA,為了防止下一個階段昂貴教育資源浪費在不值得缺陷原料上,負責把不良學生從這個過程中掃掉。
於是,那些不適合唸書又不具備天賦可被這個價值體系青睞人,就待所謂『放牛班』。
而被某些人強力關照著,希望這些學生不要被『淘汰』掉,就是『人情班』。
相對之下可以適應這個工業過程、增進知識與能力,就是『好班』。
那是一個混濁醜惡年代,這樣的教育體系對社會造成了巨大的副作用,但市場經濟結構對『生產要素朝需求價值的效率化發展』確實是有著極大的動力的,這是台灣10多年前之所以可以平穩生產中高品質的秀才滿足高科技產業需求,建立目前在台灣世界有名的產業供應鍊的原因。
十幾年來政府官員、專家學者、家長,為了解決當時教育體系對社會帶來的『副作用』- 大批被學校教育拋棄的孩子造成的社會問題、以及人才產出單一化對社會發展造成的不利因素,於是開始推動教育改革。
他們選擇的路線是:
1. 廣設大學,讓大學學歷平民化。消除『大學學歷』所代表的名牌迷思,減低社會新鮮人之間的待遇落差,同時使得高中教育畢業的學生有出路,這部份可說已經完成。
2. 減少聯考的重要性,縮小考試教材範圍、降低考試難度、多元入學等等。
3. 逐步消除高中之間的階級差距、消滅明星高中。更正確的說法,消除國高中過去幾十年來透過市場機制產生的以校為單位的產品良率分類機制。這部份將在12年國教正式上路後幾年內達成。
於是現在的台灣可以說是已經度過了那個畸形市場經濟教育體制狂飆年代。
但迎來的是什麼呢?很不幸的,迎來的是更加可怕的計劃經濟教育體制。

這個計劃經濟教育體制架構上有幾個方面:
1. 廣設大學同時繼續對大學學費進行限制與推動大學法人化。
這使得任何大學在經營面上同時失去財政、行政與董監事任用上的自主權。一間大學的資金來源處處受限、教授的聘用、系所資源的分配又沒有管理權利,大學的行政單位將自然而然的變成公務機關管轄下的附屬機構。於是只要簡單透過廣設大學,就能實質的促成『大學學歷惡性通膨』的效果。
貧民老百姓看優秀大學學歷貶值了各個拍手叫好,想說小孩子從此至少有間『平民大學』可以念,沒想到的是優秀大學學歷貶值,原有社會需求對學校間的價值匯率比例認知可沒跟著轉變,於是技職體系還有私立大學的價值崩盤,大學畢業生領得薪水跟當年的技職一樣,卻要背著學貸多念四年的書。
 2. 制度上延長國民教育,法規上強制放寬學生入學標準。
十幾年來薪水沒有長進,不論學校還是老師都只想安分過日子、混口飯吃,一般老師已經沒有機會像過去那樣『成功』了,唯一還有市場就是補習班,於是補習班更加賺錢、生意更興隆。更何況,現在家長社經力量很容易就可以壓過老師與學校還有誰敢去分學生好壞呢?大家只想趕快把學生『弄』畢業,問題丟回給家長與下一個學校

『反正學生畢了業,什麼也沒學又不會死,學校也不會痛不是嗎?』
這是普遍存在、默許、沒人講也沒人去在乎真相。
這是當一個工業化思維下系統生產結構,將市場經濟的驅動力掃除掉(升學競爭市場)後、卻沒有給予相同強大的動力來源的結果。台灣的教育從市場經濟走向了計劃經濟,學校作為教育工廠就變得只能考慮『將過程給順利完成』了。

其實從前陣子的事件:北北基聯招獨立,就可以看出來:

這只是想把QA機制給找回來、把『篩選標準』重新建立清楚而已。
台灣人思考教育跟100年前福特汽車打死不願意開發新車型一樣頑固。

繼續走這樣子垂直整合工業生產模式,台灣國民教育不會有未來。

畢竟不管是一綱多本、還是一綱一本,學校生產還不都是T型車?
對統計上一般資質學生來說,這只不過差在組裝知識零件品質好壞而已。

2013年3月7日 星期四

出走?或者是留下?



這篇其實是我對出走台灣可以是一個選擇,但不是唯一的選擇:一個矽谷工程師的告白文章的感想。

不論多麼落後,一個社會永遠不缺有能力的人。
但一個社會的人們只要普遍的缺乏勇氣,那麼有能力的人就幾乎留不下來。於是這個社會的人們就要普遍的抱怨:『為什麼這些有能力的人要走?』

道理其實很簡單。

因為當老闆的沒有勇氣,有能力的員工就沒有發揮的舞台。
因為當員工的沒有勇氣,有能力的老闆要不守成、要不揣著資本往外看。
因為當握有資本的沒有勇氣,創新失敗的逞罰就要直接澆灌恐懼、於是產業僵化、人才枯萎、機會凋零。
因為當運作政治的沒有勇氣,惡法難馴,這塊土地就不公不義,人們任有錢有勢的人欺凌,而千金之子不死於盜賊。

於是當社會普遍缺乏勇氣久了、然後資源被壟斷缺乏,你會看到人們道德衰敗、瘋狂追求不存在的穩定與確定、而老師放棄學生、父母逼迫子女繼續選擇怯懦的決定。

於是一切因循苟且、每況愈下。

當你有能力,你也不過就只是看得見而已,你又能怎麼著?
你能不走嗎?你是要活著去悲歎這一切呢?還是待著讓他們也把你變成行屍走肉?

人類社會中的一切都是以『相信』在運作著,當不存在跡象去證明『人們普遍具有實現改變的勇氣』的時候、當人們自己都不認為自己該對站出來的人一呼百應的時候,我們所期待的『有能力的人』不過就是個台灣版的堂吉柯德。

這樣的人,被一些人嘲笑、被一些人可憐,然後更糟糕的,被大多數的人們刻意忽視、遺忘。但這些選擇了忽視、遺忘的人們很多時候沒搞懂一件事,他們忽視遺忘的可能是他們自己。

這個世界很複雜、這個世界很大、有很多東西我們不可能懂,只能透過代理人去為我們爭取。
那麼當我們不再鼓勵有勇氣的人們的時候、當我們不再支持選擇高風險去創新的人們的時候、甚至我們還去選擇那些用權勢用恐懼來擺佈我們的人們的時候,那麼人們就決定了自己所處社會的命運,人們決定了自由或是被奴役,而不認同這樣選擇的人們自然會用腳去做出其他的選擇。

如果今天,我們看到出走的人們是一些我們不要的、不屑與之為伍的人,我們知道我們做對了選擇。但如果今天,我們看到出走的人們是我們社會下一個階段的領導者、知識工作者、中產階級、年輕人,那我們就得捫心自問『What have I done?』

人們想要自救,那他們得要去思考、他們得要去追求並投資可據以做出關鍵判斷的訊息來源、他們得確實的冒著風險站出來,與散佈恐懼維護既得利益的人對抗,到那時,人們將發覺有能力的人隨處都是。因為,要不你就已經成長為那個有能力的人了、要不有能力的人四海來歸,你知道的,人之所以有能力,很多時候就是因為他們的消息是靈通的。

有能力不等於有力量,但如果在民主時代力量可以來自於數量,如果在網路時代團結不再是空想,那麼剩下的就問問大家各自的追求了。

台灣不是沒有人正唱著Do You Hear the People Sing

但我們要給他們什麼樣的結局呢?

會是Empty chairs at empty tables嗎?





2013年1月23日 星期三

關於鮭魚洄游



企業家?原來你們這些埏著臉,巴著人家大腿討肉骨頭吃的狗官有看到企業家啊?
怎麼我放眼望去,只看見資本家在開公司斂財而已?


這些人拿著資本,不搞創新、不提昇員工福祉、不盡社會責任。
小人朋黨,搞免洗人才、搞裙帶關係、搞納稅人的錢。

古人說慈母多敗兒,這話一點不假。

這些混球,就是台灣錢淹腳目的時候給台灣人養出來的垃圾。
當年會離開,就是台灣沒油水了只好出發去對岸撈,臨走前還要了好大一筆『錢進大陸、債留台灣』的分手費呢。

現在這些垃圾要回來了,對著台灣苦勞百姓盈指氣使,一副施恩的語氣在那邊叫囂,而你們這些搞政治的扳開台灣的雙腿,叫我們躺著等他們來幹,然後說這是鮭魚洄游?

回你媽,這是敗家子去外面花天酒地完了,又要回來魚肉鄉民拉。