2015年6月24日 星期三

談願景和企業文化 (Vision and Culture)

從出社會工作到現在已經十多載,經歷了幾家公司,也看盡公司的起起落落。有些公司 business model 一直抓不到,一直在找尋機會如何 break even。有些公司曾經非常的成功,但大環境的變遷導致市場巨變,原本的勝利方程式變成了毒藥。或者是公司的產品沒跟上市場脈動,與消費者漸行漸遠。

這篇先不談複雜的問題,例如領導階層的問題,創新能力,市場分析等等...
我只想從這幾年的心得來談談兩個主題:
  • Vision 願景
  • Culture 企業文化
Vision 願景

Vision 的中文是願景,我覺得願景又分趨勢願景和積極願景

趨勢願景就像是你預期 10 年後將會是什麼樣的世界?根據這樣的變化你可以做甚麼樣的事情或產品來迎接未來的市場

積極願景是你希望10 年打造出什麼樣的世界讓未來更美好?這個層次是比趨勢願景更高一等級,他代表的是創造!

為什麼要有 Vision?先回想一下你看戰爭片或警匪片的時候,狙擊手通常是在什麼樣的位子?當然是在制高點把目標物看的一清二楚,才能夠在扣下扳機之後一槍命中。當一個領導就像狙擊手一樣,必須站在制高點才能看的遠,去看十年之後的方向在哪,到達終點的路途有哪些障礙物。如果站的不夠高就無法看的遠,只能夠一路跌跌撞撞的摸索,或者看著其他成功者所開闢出來的道路尾隨。

因為站的夠高看的夠遠,才能知道前方的路要怎麼走,有哪些障礙物,才能依據所看到的情報規劃出 roadmap。例如你在亞馬遜森林中迷路了,想要找到一條出路,首先你必須先找到一個高台或爬上一顆高大的樹,看一下四周環境,例如太陽的方位,附近是否有河流或村莊,亞馬遜河在哪裡,

要如何規劃思考願景?其實是一個大哉問。以近代企業來說,似乎只有賈伯斯是個能看穿未來世界,一手規劃從 iPod 到 iPhone /iPad,建立行動市場的生態 (App Store)。但是,難道必須如強者賈伯斯之超人才能去做願景規劃嗎?其實非也!任何企業都需要願景,也必須投入資源去探索願景,雖然我輩之流不能像賈伯斯一樣登高一呼叫大家 Follow ME!但透過持續的探索和持續的修正,也能為企業找出一條血路出來,就算不是康莊大道,也能是個到達目的地的崎嶇小徑。

我想強調一個重點,沒有多少強者能夠一開始就能準確預測未來的三五年的市場趨勢,因為現在已經是全球化的世界,任何國家或市場的脈動都可能會影響未來的發展。唯有透過不斷的探索,才能找到那條崎嶇小徑,如果只是佇在那裏不動等人家搶灘頭堡後再去 Follow,那只是不斷地採別人的足跡撿拾剩餘的價值;又或者是亂槍打鳥毫無章法的淺嚐即止,不願意認真的深入研究嘗試,員工只會被你搞得頭昏腦脹、筋疲力盡。


Culture 企業文化

剛畢業投入社會的時候,對於企業文化這個名詞完全沒有概念,當時很流行 HP Way 這樣概念的東西,只覺得好像是一家大公司的 slogan,用來提升自己形象的廣告詞。隨著工作打滾多年之後,漸漸的對企業文化這個 term 有了比較深入的了解,原來他可以不是 Slogan,他應該是企業組織裡的 DNA,去驅動每一個單位裡每一位員工。

其實每一個公司都有他的企業文化,差別只是在於和他的 Slogan是否相符而已,台灣一些公司還是和以前反共復國時期一樣,以為只要把標語寫在牆上事情就會成真。DNA是騙不了人的,就好像是偷生的小孩用DNA就能驗出真假一樣,把自己公司說的天花亂墜,但DNA是騙不了人的。企業文化通常是由創辦人在建立公司的過程當中,內斂萃取出來的特質所形成的。

企業文化之重要在於他決定了企業做事情的態度,例如:Amazon 上自創辦人兼 CEO Jeff Bezos,下到 Engineer / service staffs,所奉行的企業文化就是 "Customer Centric",所以 Jeff可以為了一個客訴而親自對客戶溝通。一家企業能不能夠屹立不搖,就在於他能不能夠有效的建立企業文化,去驅動自己、去改革自己。企業文化不需要是艱深的道理,重要的是他是不是深植在企業組織的 DNA 裡,而不只是那牆上的標語而已。



自己從工作到現在總共待過大約三家公司,有幾家是大企業,有一家是startup的小公司,好像都經歷了由盛到衰的歷程(是自己帶衰嗎?),回想過去這些企業的歷史,似乎都和願景及企業文化有蠻大關聯。隨著全球化浪潮,科技業也正面臨新的工業化時代,許多產業正處於破壞式創新。要如何在新的工業化革命中不被消滅,我認為積極的探索願景和良好的企業文化,絕對是這場革命浪潮中迫切需要的救生圈。


Android BLE App Development


Bluetooth and BLE

BLE standards for Bluetooth Low Energy, which is standardized as Bluetooth 4.0. It doesn't intended to replace or enhance classic Bluetooth (2.0/3.0). It is designed with a new protocol stack for the specific services/applications which required much lower power consumption for getting much longer lifetime. 



BLE defines following roles in GAP from the perspective of BLE .
- Peripheral device
The peripheral device broadcast
- Central device

I think you can find a lot of more information in the other public websites. Therefore the detail about BLE is not introduced here. The major focus here is to let you know BLE programming for Android.

BLE Working Flow

Generally the BLE programming on a smartphone or table works as a central device. It scans the peripheral devices and then connect to it. The connection then will be used to access the peripheral device's attributes/characteristics or wait for the notification from peripheral device. You can refer to the profile document to know more detail about how to access the attributes/characteristics.

Below I divided a complete BLE session into following pieces from the role of a central device.

1.      Scan BLE device
2.      Connect to a device
3.      Read/write BLE attributes (characteristics)
4.      Receive GATT notification (optional, based on the need of profile)

BLE Permission Declaration

Before starting the BLE programming, you have to declare enough permissions for  BLE operations on an Android device. Below are the permissions you should add in your App.

Declare the Bluetooth permission(s) in your application manifest file.

<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>


If you want to declare that your app is available to BLE-capable devices only, include the following in your app's manifest:

<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>


Android BLE API

Android starts to support BLE since 4.3 (API level 18). It introduced the Bluetooth LE related functions as below:
BLE scanning function was added in the existing class “BluetoothAdapter” which works originally for the traditional Bluetooth (2.0/3.0). More classes were also added to support BLE features  

Since Lollipop (API level 21), a new package “android.bluetooth.le” was introduced to address the BLE device scanning and advertising. The class “BluetoothLeScanner” is used to replace the Bluetooth LE scanning function

Device scanning:

(BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);

API level 18 ~ 20
BluetoothAdapter = BluetoothManager.getAdapter()
BluetoothAdapter.startLeScan()

API level 21 or later
BluetoothAdapter = BluetoothManager.getAdapter()
BluetoothLeScanner = BluetoothAdapter.getBluetoothLeScanner()
BluetoothLeScanner.startScan()

Device Connecting

To setup a connection, you need to create a service to receive the response of a service request.
Use bindService to bind this service with your activity. After it, the connectivity is managed by the event (intent) for connection, profile attributes, characteristic

That’s why we need to do 2 things before really starting the connecting.
-          Bind Service
-          Register Receivers to register all intents in the activities from the BLE service you bind.

ACTION_GATT_CONNECTED                          connected to a GATT server.
ACTION_GATT_DISCONNECTED                     disconnected from a GATT server.
ACTION_GATT_SERVICES_DISCOVERED                discovered GATT services.
ACTION_DATA_AVAILABLE                              received data from the device. This can be a result of read or notification operations.

BluetoothDevice = BluetoothAdapter.getRemoteDevice() // by giving device address
BluetoothGatt = BluetoothDevice.connectGatt()

Speedup the reconnection
BluetoothGatt.connect()


Read/write Attributes

-          After connecting to the remote GATT server, you can request to get the service
BluetoothGattService = BluetoothGatt.getServices()
-          When you get the service, you can use it to get its characteristic to read or write according to the definition in the profile.
BluetoothGattCharacteristic = BluetoothGattService.getCharacteristic()

Here I use the diagram below to illustrate the relationship of the classes.




Receive GATT notification (optional)