Dropbox 從支持到放棄使用 C++ 跨 iOS、Android 平台開發的始末

寧願寫兩遍代碼,也不用C++跨iOS、Android平台開發:
https://kknews.cc/zh-tw/tech/y3g4knj.html

該文章發布於 2019年中

Dropbox 最近宣布將放棄用 C++ 編寫跨 iOS、Android 平台代碼,轉而使用各平台的原生框架(Swift / Kotlin),理由是代碼共享相關的隱藏成本太高。有趣的是,2014 年,Dropbox 在給 Facebook 的開發人員做分享時,卻曾直言寫兩套代碼會帶來種種弊端,推薦使用 C++ 進行跨平台開發。為什麼幾年前的經驗之談卻成了幾年後的技術債?C++ 因何躺槍?跨平台開發前景如何?本文試圖一一為你講解。


事件綜述

編寫一次,隨處運行。這句話不知道被多少工具和框架寫在開篇介紹中,用以吸引更多公司和開發者。然而,作為這一策略忠實的實踐者,Dropbox 近日宣布放棄這一想法,寧願為不同的平台寫兩遍代碼,也不用 C++ 跨 iOS、Android 兩大平台共享代碼的方式進行開發。

早在 2013 年,Dropbox 就採用上述策略進行移動開發,這背後的想法很簡單:用 C++ 編寫一次代碼,而不是用 Java 和 Objective-C 編寫兩次。那時,整個移動工程團隊相對還比較小,但需要支持快速增長的移動路線圖。因此,公司希望找到一種方法,使這個小團隊可以快速交付大量 Android 和 iOS 代碼。

如今,Dropbox 完全放棄了這個策略,轉而使用各個平台的原生語言(主要是 Swift 和 Kotlin,這兩種語言在剛開始制定移動策略時還不存在)。這個決定的主要原因是代碼共享相關的隱藏成本太高,這源於同一個基本問題:

以非標準的方式編寫代碼,使 Dropbox 承擔了一些開銷,而如果採用廣泛使用的平台默認選項,就不必擔心這些開銷,這種開銷最終比只編寫兩次代碼要昂貴得多。


C++ 的問題?

隨後,Dropbox 總結了成本太過高昂的主要原因,比如自定義框架和庫的開銷、自定義開發環境的開銷、處理不同平台差異的開銷以及培訓、招聘和留住開發人員的開銷,這與 C++ 本身存在的問題密切相關。但是,C/C++ 是唯一一種編譯器同時受到谷歌和蘋果支持的語言,如果使用其他語言將會產生一系列更麻煩的問題。

1、自定義框架和庫的開銷

關於使用 C++,最容易出現的開銷就是構建框架和庫,這大致可以分為兩類:


  • 框架,讓開發者與主機環境交互,構建一個功能齊全的移動應用程式。例如 Djinni 、用於在後台和主線程中運行任務的框架等。
  • 一些取代本可以在平台原生語言中使用的默認語言或開源標準的庫。例如:用於 JSON(反)序列化的 json11 ;C++ 非可空指針 nn 。

如果使用平台原生語言,那麼這些代碼都是不必要的。當然,並不排除個別開發者可以很好地利用開源 C++ 庫,但是 C++ 開發社區中的開源文化並不像移動開發社區那麼強大(特別是幾乎不存在的 C++ 移動社區)。這些成本在 C++ 中特別高(與 Python 或 C# 等其他可能的非原生語言相比),因為它缺少一個功能齊全的標準庫。

雖然 C++ 標準委員會為了這門語言做了大量工作,甚至為了 C++20 的新特性舉辦了一場歷史上規模最大的會議(180 人參會),試圖通過會議確定哪些特性可以加入新版本,比如 Concepts、Ranges、Modules、Coroutines 等,但大部分開發人員並不認可此次調整,並將部分新特性歸結為「語法糖」,在社交平台進行吐槽。

國外的一位遊戲開發人員接連在社交平台發表看法,甚至發表了一篇長文聲明自己不看好 C++20 的新特性,並認為新版本沒有解決最關鍵的問題,這讓其未出世就被群嘲。可見,整個 C++ 社區是存在一定問題的,很難讓其達到移動開發社區中的活躍度,很多問題也是懸而未決。

2、自定義開發環境的開銷

移動生態系統有許多工具可用來提高開發效率,但 C++ 社區就不太行。開發者必須投入時間構建支持 C++ 代碼共享的工具。甚至,Dropbox 親自做了定製構建系統,創建了包含 C++ 代碼以及 Java 和 Objective-C 封裝器的庫,並且生成 Xcodebuild 和 Gradle 都能識別的目標文件。這個系統是一個很大的成本支出和拖累,因為需要不斷更新以支持兩個構建系統中的更改。

3、處理不同平台差異的開銷

儘管 iOS 和 Android 應用程式都是「移動應用程式」,通常具有相同的特性和功能,但平台本身存在一些影響實現的差異,甚至不能真正地編寫一次代碼就在不同的平台上運行,必須花費大量時間將代碼集成到不同的平台中,並編寫特定於平台的代碼(有時這些代碼就位於 C++ 層)。

4、培訓、招聘和留住開發人員的開銷

如今,市面上越來越難招聘到具有相關 C++ 經驗、對移動開發感興趣的高級工程師。當然,如果願意提高招聘成本,給出更有吸引力的薪水,這個問題不難解決。但是,怎麼把這些開發人員留住也是一個大問題。事實上,移動開發社區有大量新技術和新模式層出不窮,移動開發者可能根本不想從事 C++ 項目開發。

如上種種,通過 C++ 共享移動代碼的方式讓開發成本變得非常高昂,這也讓曾經的支持者 Dropbox 不得不選擇放棄。


跨平台開發的 Yes or No

"Write once, run anywhere" 一直以來就是開發者的夢想。但從 Dropbox 的經驗來看,實現之路堪稱曲折甚至反覆。

我們發現了一個特別有意思的新聞:2014 年,Dropbox 的開發人員給 Facebook 的開發人員做了個講座,分享了他們使用 C++ 做跨平台開發的經驗之談。他們特別提到,iOS 和 Android 平台代碼庫的不一致會帶來一系列問題:

  • 開發和維護成本成倍增加。
  • 開發團隊需要多次修復同樣的缺陷。
  • 針對某個平台報告的缺陷可能會被另一個平台忽視掉。
  • 不同平台的 App 行為可能會有預料之外的細微差異。
  • 性能優化成本高昂並且與平台相關。

Dropbox 賴以克服上述這些問題的策略基礎就是為所有 UI 無關的代碼建立一個共享的跨平台 C++ 庫,例如數據和網絡部分的邏輯。UI 部分還是使用原生代碼編寫,以便儘可能地利用平台對動畫特效和設備傳感器等的支持,並且確保充分的響應速度。

5 年過去,當年的經驗之談似乎變成了 Dropbox 的技術債,他們最終放棄了用 C++ 做跨平台開發,轉而用各平台的原生語言做開發工作。


跨平台開發,是時興潮流還是明日黃花?

2018 年,Airbnb 放棄使用 React Native,回歸使用原生技術,究其原因主要是:項目龐大後,維護困難;第三方庫良莠不齊;兼容上需要耗費更多精力……

騰訊客戶端工程師方秋枋接受 InfoQ 採訪時曾表示:

這些都是跨平台框架的通病。跨平台意味著需要花費很多時間來解決平台差異性問題,同時要面臨第三方庫不夠原生平台豐富健壯的現狀。跨平台其實是犧牲部分功能和體驗,換取開發速度和一致性的權衡,並不是業務開發的銀彈。

微信團隊在跨平台開發方面的解決方案是:

目前微信團隊並沒有統一使用一套跨平台開發框架。我們也在積極探索各種可能性。

微信小程序,是跨平台開發的第一、二階段的融合做法,利用 Webview 作為渲染容器,通過規定 Web 技術棧的子集(WXML、WXSS),讓客戶端獲得更多的渲染性能優化空間,同時通過規範化組件的使用,逐步引入原生控制項代替 Webview 渲染。

除此之外,我們還探索了基於 C++ 進行跨平台開發。實質上還是第二階段的做法,只不過是使用 C++ 作為中間語言,去編寫業務代碼和調用原生控制項。為什麼要採用 C++ 呢? 因為 C++ 安全性會更高一點,同時性能也會更佳。可以應用在一些對安全性要求比較高的場景。


Flutter 會是跨平台開發的終極之選嗎?

這個問題很有意義。能實現跨平台開發的框架也五花八門,讓人眼花繚亂。最流行的跨平台框架有 Xamarin、PhoneGap、Ionic、Titanium、Monaca、Sencha、jQuery Mobile、React Native、Flutter 等等。但這些工具的表現也是高低有別,各有千秋。熱度不減的只有 React Native 和 Flutter,原因在於這二者背後有 Facebook 和 Google 背書,開發者更加信任。

Flutter 的優勢在於:它完全免費,徹底開源;可以用來更快地創建應用;具有出色的用戶介面(UI);節省代碼量;可接入平台原生功能;最適合 MVP 開發(最小化可行產品);較老的設備也使用相同 UI 運行應用;減少測試工作量;更豐富的社區支持;較低的維護難度;內置來自 Dart 的包管理器。

其中不少特性如節省代碼量、接入平台原生功能、支持較老設備、較低維護難度等等,都擊中了跨平台開發的痛點。業界認為,目前跨平台開發沒有一個完美的解決方案,相對來說 Flutter 在兼容上做得好一點,通過自底向上自研框架來儘可能減少平台差異,但是可靠性仍需進一步檢驗,引入 Flutter 需要大家對自己公司業務有非常清晰的認知,並權衡好利弊。

隨著 Google 對 Flutter 的持續加碼,也許在不久的未來,Flutter 將成為跨平台開發的最佳解決方案。


一個 App 在 iPhone 中的 life cycle

Stanford大學CS193P第三堂課的其中一張投影片:

一個 App 在 iPhone 中的 life cycle


Objective-C 的記憶體管理:
https://kaochenlong.com/2010/11/22/memory-management-in-objective-c/

Objective-C 記憶體管理之 Autorelease:
https://kaochenlong.com/2010/11/25/autorelease-in-objective-c/



macOS 快捷鍵

多重桌面
Control + 向上鍵
Control + 向左鍵
Control + 向右鍵

資料夾或文件
command+delete (丟到垃圾桶)
command+C (複製)
command+V (貼上)

處在中文輸入法的情況時
shift+, (逗號等等標點符號)
shift+. (句號等等標點符號)
其餘標點符號依此類推

擷取畫面
command+shift+3 (擷取全螢幕)
command+shift+4
(拖移十字線 以選取要擷取的螢幕範圍。 若要移動所選範圍,請在拖移時按住空白鍵。 若要取消拍攝截圖,請先按下Esc(Escape)鍵。)

另外還有『擷取軟體視窗,有陰影』、『擷取軟體視窗,無陰影』、『固定擷取大小,移動擷取區域』、『固定擷取長度或寬度,移動另一邊大小』,詳閱
https://www.bnext.com.tw/article/41237/mac-screen-capture-keyboard


Xcode 快捷鍵

文檔和參考: command + shift + 0 (Zero)

程式碼
增
command+C (複製)
command+V (貼上)
刪
control+K (删除整行)
control+D (删一個字元)
改
command+[ (程式碼在同行往左縮)
command+] (程式碼在同行往右縮)
command+option+[ (整行程式碼往上移動一行)
command+option+[ (整行程式碼往下移動一行)
command+/ (註解)
command+Z (回復上一步)
command+B (編譯)
command + \ (開啟中斷點狀態設中斷點)
command+左/右键 (程式碼頭/尾)
command+shift+左/右键 (選取光標以左/右的程式碼)
command+L (直接跳到輸入行數的程式碼)
command+A (全選)
查
command+F (查此文件內的關鍵字)
command+Shift+F (查此專案內的關鍵字)

文件
增
command+N (增文件)
command+option+N (New Group)
刪
command+W (關閉視窗)
改
command+O (打開專案)
command+S (儲存)
查
command+shift+O (查專案內的文件或某個方法定義)
command+control+左/右鍵 (剛瀏覽過頁面的順序)

編輯區
command+0 (隱藏左區Navigator)
command+option+0 (隱藏右區 Utilities)
command+shift+Y (隱藏下區 Debug Area)
command+control+F (視窗最大化)
command+H (視窗最小化)
command+tab (把最小化後的 Xcode 顯示回來)

輔助編輯器 Assistant Editor
command+option+enter (開)
command+enter (關)
option+左鍵點擊操作 (在輔助編輯器 Assistant Editor 中打開文件: 在項目導航器中選中文件執行)
control+6 (文件跳轉:鍵入方法/變量名+Enter 跳轉)

storyboard
control-shift-click (顯示UI階層清單)
control + enter (Label 內文字換行)

模擬器
command+R (跑模擬器)
command+Q (關閉模擬器)
command+左/右键 (切換橫豎屏)
option+shift (在模擬器中雙指拖動效果)
option (在模擬器中放大縮小效果)
command+shift+H (模擬器的 Home 鍵)
command+K (當 keyboard does not show up in simulator)

iOS 開發究竟該不該使用 Storyboard?

Google 關鍵字
「不使用 Storyboard」、「iOS 純程式碼」、「nib xcode」、「segue swift」


OK,讓我們坐下來好好談談 Storyboard:
https://medium.com/@royhsu510/aec2656cf16e


你為什麼不該在你的 iOS 軟體專案中使用 Storyboard
https://zonble.net/archives/2014_01/1540.php

=> 樓主的看法是不該使用 Storyboard,但是在討論區中也有讀者提出完全相反的看法
因為一個 App 應該要做好減法管理,避免過度膨脹,
在一個頁面有限的 App 中,使用 multi-storyboard,關鍵在於怎麼切分。


不使用 Storyboard 的好處
https://medium.com/@Chien_Cheng/813053e3692d
https://blog.bobthedeveloper.io/why-i-dont-use-storyboard-fe14a1a99f58


純 Swift 專案:Xib | StoryBoard 多人協作技巧
https://juejin.im/post/5c468f676fb9a049ed313183

如何將單個 VC (View Controller) 中的功能分解到幾個子 VC 中,並實現各個 VC 的交互,從而讓 VC 的體積不再無限增長:
https://www.jianshu.com/p/091c08c51f55


論壇的討論
https://kaif.io/z/programming/debates/b10ryBtyUL


捨棄 Storyboard 使用純程式碼 的方式撰寫 ViewController
https://ithelp.ithome.com.tw/articles/10160712


View Controller 流(純程式碼版)




在 2019 WWDC 大會上,Apple 發表了一令人振奮的消息,也就是 SwiftUI 的降臨,而 SwiftUI 和 UIKit 其實是對等的,都是用來處理 UI 的 framework,,網路上的學習文章也愈來愈多且豐富。不過呢,Apple 仍持續在調整 SwiftUI 的語法,網路上比較早期的部份教學文章或解法甚至都已經無法使用了。

UIKit 是從 Xcode1 就一直存在的 Framework;而 SwiftUI 則是 2019/6 WWDC 所發表的全新用來繪製 UI 的 Framework。因此,SwiftUI 必須搭配 iOS13+ 和 MacOS10.15+。

UIKit 底層仍為 Objecitve-C;而 SwiftUI 則是完完全全用 Swift 打造的 Framework。

使用 SwiftUI 所開發的專案,可以同時支援 iOS、macOS、watchOS、tvOS 等系統。

開發 iOS 的兩個派系,純 Code 、非純 Code 派,此兩派經常討論程式碼的一致性、直覺性,純 Code 總拿一致性抨擊對方,而另一方則是拿直覺性來回應之。不過,當 SwiftUI 降臨後的那一刻起,或許可以在這兩個派別間稍稍緩頰了。





Refactor to Storyboard: 使用多個 Storyboard 來開發專案

https://medium.com/%E5%BD%BC%E5%BE%97%E6%BD%98%E7%9A%84-swift-ios-app-%E9%96%8B%E7%99%BC%E5%95%8F%E9%A1%8C%E8%A7%A3%E7%AD%94%E9%9B%86/e0d513fb5bcb

https://ithelp.ithome.com.tw/articles/10206572

在我們開發過程中,我們會經常在 Storyboard 上拖拉許多 ViewController,而這些 ViewController 其中又包含我們許多 View 的元件,所以在我們專案開發到一定程度的時候,
你會發現這樣做在 Storyboard 上會有許多缺點:

讀取速度隨著開發時間,越來越慢;
畫面間的 Segue 連線變得複雜;
很難找到其中一個 ViewController 的畫面;
當多人合作開發 App 時,如果大家都編輯同一個 storyboard,git 在合併時沒那麼聰明,時常會發生衝突...

不過現在這些問題都不再是問題了,因為 Xcode 可以讓我們在不同的 storyboard 設計畫面,然後再將這些畫面串接起來:

利用 Refactor to Storyboard 將多個 controller 拆到另一個 storyboard。

APP 上架前需要思考的四個問題

https://tw.alphacamp.co/blog/2015-07-29-app-competitive-analysis

短短數年光陰,因智慧型手機的普及和 4G 頻寬的擴大,讓 APP 的數量如雨後春筍般的蓬勃發展,也因此在這個紅海中,若我們想要在此先搶得一席之地,應該做怎樣的競品評估和分析呢?
扣除 ASO(App Store optimization)優化外,是否可以從某些細節中了解箇中差異?
以下是我操盤 Apps 的經驗分享給大家,希望對想進軍 APP 市場中的您和團隊有所幫助。

在操作及輔導那麼多 App 團隊當中,通常我會區分三種身份(跨國企業、公司行號、獨立開發工作室),本文將針對沒有資源且以技術為基底的獨立開發工作室用最白話的方式當做範例做為解說。

一般來說獨立開發工作室,和其他兩種身分最大的差異在於,當一款 App 開發完成後,扣除熱情、夢想和時間外,其實最常碰到下列幾個問題。

我的消費市場在哪邊?
我的競品是誰?平台(Google Play & IOS)中類別的影響是?
沒有行銷預算怎推廣?
第三方平台對我的幫助是?



一、我的消費市場在哪邊?

一般來說,獨立開發工作室通常會碰到這個問題,好不容易找齊了團隊,產品也順利開發完成,但產品推出後卻發現消費市場和自己想的有點出入,而造成產品和推展停滯。

其實別想太多,在 App 的市場當中若只想做好台灣市場,我其實是不太建議。

在行動的領域,其實應該勇於將產品推向世界,在台灣的營銷則可以當作市場磨練水溫,要知道當你的 App 上架到(Google Play & IOS),除非你自訂國家/區域發佈,否則就該把自家的產品拓展到全世界,目前耳熟能詳的 App 當中多數都是跨國型的 App,行動的市場本無疆域性質,它不太像網際網路,當你在台灣搜尋 “電子商務” 這組關鍵字,出現的將會是台灣相關的網站,但在(Google Play & IOS)當中,可能會出現的是北美或者其他國家/地區的 APP 名稱。這也是為啥當你打你想要的關鍵字,卻可能出現非繁體字的 APP 的原因。

二、我的競品是誰?平台(Google Play & IOS)中類別的影響是?

通常這是我上課常常被問的問題,若說甚麼是應用程式類型 App 的競品,我都會說是遊戲產業,若是遊戲產業我則會說那些有陸資色彩或跨國企業在台公司。以上這些非玩笑話,只因為一款 App 上市在這個紅海中的紅海最先決的條件就是被找到,沒有被找到的 App 就沒有其價值,所以這些行銷投放預算較大的 App ,因為知名度足夠,才能夠有後續的營運模式發展。

另外台灣的市場非常適合當作產品水溫測試,畢竟要在一個地區能有那麼多智慧型裝置族群,又有那麼多不同屬性商圈環境的國家/地區著實不多,這也是為何台灣充斥那麼多非本土型 App 的原因。那獨立開發工作室沒有預算就不能在這個市場上競爭了嗎?錯! 獨立開發工作室有的是速度和靈活性,根據最新一期資策會數據台灣智慧型裝置族群高達 77.3%(約1,604萬人),這意味者你所開發的 App 不是沒人使用而是沒人知道它的存在,所以在此建議當一款產品上架後,設定你認為 App 產業你覺得最好相同類型 App 進行參考(文案、關鍵字)。

以燦坤福利品 App 為例,因市面上 3C 知名度較高的為 PCHOME ,而他的 APP 行動名稱為 24H 行動購物,所以我在操作上藉由 24H 購物的高曝光,讓使用者搜索增加驅動力下載,我在前面文字上說過 App 要能被找尋到才有其價值,因會搜索 24H 購物的使用者,推測是 3C 或電商使用者,故文案(ASO)設定 24H 購物,可以找尋到更正確的用戶,當然燦坤福利品的留存率也要維持在 30%,借力使力才可以讓 App 存活的更好。

另一個可以參考競品評估則是在平台(Google Play & IOS)中類別,為何這樣說呢?以鬧鐘這個關鍵字為例,當好不容易製作了一款鬧鐘,我們所想的可能是放在生活類別,但詳細觀察當你將鬧鐘放在生活品味這個類別後,將發現什麼房屋出租類型 App、Qrcode 二維碼類型 App 或行動類型 App 都在此類別,而這些都是你所謂的競爭對手,在已知的行銷法則當中,我們會把 SWOT 當作競品規劃中一個選項,但法則中不太會告知行動行銷碰觸到的原來不是近似的競爭品項,而是只要放在同個類別,能佔據消費者智慧型手機時間的 App 都將是你的競品,這也是很多行銷高手在行動行銷領域當中可能會滑鐵盧的原因,因為行動行銷的操作要更加整合、交叉和虛實三者並行。

三、沒有行銷預算怎推廣?

剛剛前面兩段寫了消費市場和競品,現在要寫非常實際的內容,若沒有錢我該怎樣行銷推廣呢?

其實在寫之前想請大家思考一下,在記憶當中的 App 產品當中,扣除遊戲業者有多少是花大筆預算而被下載的?而有多少你不知道的 App 卻被下載超過百萬次以上的?我想身為行銷操盤者的我會說,行銷就是要投放預算,且這預算可能隨者產品的上線可能花費會越來越多,因為產品收益回饋也越來越大,這是一種成長。但獨立開發工作室的 App 可能沒有預算那怎麼推廣呢?以下的口訣分享給大家,善用社群、靈活調配、借力使力、勇於國際和捨與得別害怕。

前陣子看了一篇文章,標題是寫社群是窮人家的原子彈,這話其實很貼切,但前提要提醒大家,真實要玩社群是非常花精力和金錢的,會這樣說社群是窮人家的原子彈是因為人與人的互動是具備散播性,而當社群切中議題,後續發酵將超乎預期,可以從最早的「開心農場、憤怒鳥和一次次社會議題」可以看到這個道理,所以當獨立開發工作室的產品要上線,先問自己所有的論壇、免費媒體發佈工具是否都準備齊了!

靈活調配:獨立開發工作室和公司行號有個最大的差異就是,能夠生存就是一切,所謂的規範都是產品成功後才配提出,所以當產品上線首要就是當市場回饋的所有客訴及問題,都將要在最快的時間修正完成,沒有所謂的1-10的排程規劃,只要市場喜歡哪一個,就該拋開一切原則,迎接市場才是。

借力使力:借有行銷資源的力,借成功範例的力,借別人有自己沒有資源的力,不要什麼都一條龍的模式操盤,這將會累死自己。

勇於國際:想要有大下載量,想要被創投發現,想要有高廣告收入,大膽的將產品設計成英文語系版本吧! 若有一點小預算,就進行海外投放,效益應該將會超乎侷限的國家/地區的。

捨與得別害怕:其實這塊很兩難,但在行動領域當中往往我們可能開發多時的產品因為市場的不領情而膠著不前,但有可能自己認為的小作卻可能在市場大放光明,如:2048、知識王、aa 或連續劇型 app。還是老話一句,當你的產品在這個紅海中的紅海被找尋到後,下一步將要思考這 App 對於消費者的日常生活而言,到底將有怎樣的幫助,並不是產品優化或者產品格局夠大市場就會接受的。要知道人類演化也好歹幾百萬年,並不要因為智慧型裝置的普及消費者的使用習性和腦袋就升等阿,只能說開始不排斥和接受而已,所以該捨該得就放寬心吧。

四、第三方平台對我的幫助是?

其實我們常常為犯了一個錯誤,想要占有所謂的 80% 客戶反而失去了那 20% 創造產值的消費者,而這 20% 的消費者有可能間接的影響 80% 的客戶群,在所謂的 App 操作當中,我會建議獨立開發工作者,扣除以上所說的操作外,大量的前往第三方平台試試看自身產品的水平吧,要知道許多第三方平台會使用者有可能是對於 App 高度使用的狂熱份子阿! 還有第三方平台其實也會有所謂的經營行銷團隊,若你的 App 是一款不錯的 App 而本身卻也沒有多餘的行銷預算,為何不先搭者第三方平台的行銷曝光呢? 對我來說第三方平台是一個進可攻、退可守的工具,我知道 Google Play & IOS 使用者很多,但也別忘了當你認知的也可能也是大家認知的,有時候遠路未必不是近路,分享給大家。

結論:

最後我們再複習上架前你需要做的 APP 競品評估和分析幾個重點

‍

行動行銷強調的重點有三個:整合、交叉與虛實

所謂的競爭對手分兩塊:類別和其他主要佔據消費者時間的 App

社群和第三方平台可能是獨立開發者進入 App 市場的原子彈

獨立開發工作室和企業的最大的優勢:速度和靈活性

上架到 Google Play

http://kirafugames.blogspot.com/2013/12/0026-amazon-kindle-android.html


上架到 Amazon App Store

http://kirafugames.blogspot.com/2013/12/0027-amazon-kindle.html#more

https://www.youtube.com/results?search_query=amazon+app+store+publish

程式語言編年史

程式語言編年史原文 下面這張圖片描繪了整個程式語言的歷史。包括各種程式語言的發明人、程式語言的特點和適用領域、被什麼網站或公司使用等 (檢視 完整高清圖 )。 之所以會有那麼多不同的程式語言是因為設計程式語言的初衷不同、對語言學習曲線的追求不同、不同程式之間的執行成本差異...