說在前面
話說上回我的一篇《從0到1的團(tuán)隊(duì)》吸引到了一位明星作家,為什么叫明星作家,因?yàn)樗S手寫了一篇文章后有報(bào)社問他要稿。哈哈,一鳴驚人!對(duì),他就是我們團(tuán)隊(duì)的第七號(hào)成員--斌哥。我們團(tuán)隊(duì)一產(chǎn)品經(jīng)理,一財(cái)務(wù),一編輯,一設(shè)計(jì),三iOS工程師。
對(duì)了,我們后端服務(wù)器誰搞?尼瑪,從組隊(duì)開始我就一直糾結(jié)這個(gè)問題。后來沒辦法,斌哥忙兩個(gè)項(xiàng)目,餅仙是新手。最后只能由我來去搞搞佢咯。我們的策略是采用第三方服務(wù)器平臺(tái),有阿里云服務(wù),騰訊云服務(wù),百度,微軟,亞馬遜。除了百度沒去了解,其他都了解過了。
事情經(jīng)過
事實(shí)上這些云服務(wù)都是組合使用的,什么開放存儲(chǔ)服務(wù)OSS、內(nèi)容分發(fā)網(wǎng)絡(luò)CDN、云數(shù)據(jù)庫(kù)RDS等等,對(duì)于一個(gè)iOS開發(fā)者來說真尼瑪?shù)疤?。看著各種計(jì)費(fèi),真不知道該怎么算。由于我們主要做產(chǎn)品推薦服務(wù),那么怎樣結(jié)合這些服務(wù)省錢呢。當(dāng)然我腦海中模型大概是:我們需要一個(gè)存儲(chǔ)資源的服務(wù)器,還要一個(gè)查詢產(chǎn)品關(guān)系結(jié)構(gòu)的SLQ數(shù)據(jù)庫(kù)服務(wù)器。
以上也引出了第二個(gè)困難,產(chǎn)品推薦搜索和查詢都需要寫服務(wù)器的代碼,雖然會(huì)點(diǎn)Java語(yǔ)言,但畢竟只是會(huì)語(yǔ)言而已,JavaEE可不懂 。沒辦法,看來需要找人幫助了。打聽到產(chǎn)品妹子認(rèn)識(shí)很多計(jì)算機(jī)工程系的人,就找到她訴說了我們遇到的困難,關(guān)于那些編寫專業(yè)的服務(wù)后臺(tái)程序我們沒法做。
產(chǎn)品妹子反饋的信息卻是:計(jì)算機(jī)工程系的哥們覺得我們?nèi)齻€(gè)工程師連這個(gè)都搞不定,很菜的樣子(大概意思)。多次交涉無果還被噴了,此時(shí)此刻請(qǐng)容許我喝一杯82年的雪碧壓壓驚。

當(dāng)時(shí)我憤怒了,回了妹子一句“真是個(gè)眼高手低的家伙”,隨后我又收回這句話并道歉了。想想每次看技術(shù)大會(huì),各大互聯(lián)網(wǎng)公司都在吹自己的服務(wù)器多牛逼,服務(wù)架構(gòu)多牛逼。居然瞧不起,說如此簡(jiǎn)單的事都搞不定。雖然這是個(gè)興趣項(xiàng)目,但也要為后期想想吧。前期的不專業(yè)會(huì)為后續(xù)帶來沉重的打擊的。后來知道編輯手的男友是搞Web前端的,向他請(qǐng)教,雖然他回復(fù)說服務(wù)器這塊不太懂幫不上忙。但很佩服這認(rèn)真的態(tài)度。馬云說,我們要有敬畏之心。人太容易浮躁了,隨時(shí)提醒自己保持敬畏之心。
回過頭來,我也去請(qǐng)教老師了,不過老師說可以用自己的電腦做服務(wù)器。后來我用XAMPP這個(gè)Mac軟件實(shí)現(xiàn)了,在路由器設(shè)置一下,外網(wǎng)也可以訪問。不過不太好,不開電腦就沒數(shù)據(jù)了!!!杯具。
還是試試云端平臺(tái)吧,騰訊的云只有15天試用期有點(diǎn)少,沒考慮(我們的財(cái)務(wù)只是來打雜的,千萬別告訴他)。亞馬遜免費(fèi)一年,不過服務(wù)器不太穩(wěn)定(國(guó)外的)。微軟云一元用一個(gè)月,不過去看看收費(fèi)介紹,嚇暈了。最后阿里云,看了好久好久,仔細(xì)看了OSS存儲(chǔ)。最后選用了阿里云。其中各種云平臺(tái)的文檔沒少看,頭暈?zāi)垦5?。最后提一提t(yī)ower上贈(zèng)送的1500元啟動(dòng)資金根本就是用來看的。
遇到困難
一個(gè)外行進(jìn)入不熟悉的領(lǐng)域就像一只羔羊迷失在廁所,最后哭暈在廁所。各種注冊(cè)實(shí)名制就不說了,說說其中麻煩的流程吧。不得不說阿里的安全意識(shí)非常強(qiáng),各種驗(yàn)證和加密把我搞得頭暈?zāi)垦D5、哈希、base64之類的。文檔一遍一遍地看,感覺有點(diǎn)感覺的時(shí)候忽然想起會(huì)不會(huì)有iOS的SDK呢?結(jié)果一搜真有,馬上下載SDK瞧瞧,操作蠻簡(jiǎn)單的,幾乎什么都做好了,主要是傳值而已(SDK中各種類的協(xié)作還是要仔細(xì)研究的)。【呦,有SDK使嘜驚啊!】
在看SDK的時(shí)候,其中有一個(gè)參數(shù)是資源鍵(resources key)。由于沒經(jīng)驗(yàn),不知道有經(jīng)驗(yàn)的人是否馬上能看出是什么鬼。結(jié)果折騰來折騰去老是返回not found,想想服務(wù)器控制中心有了,主機(jī)名有了應(yīng)該差資源服務(wù)器上的路徑了,怎么變URL是不能變的啦。結(jié)果一試O了。資源路徑為什么要叫資源鍵?

當(dāng)然這樣的服務(wù)器只能用來做簡(jiǎn)單的事情,畢竟不是行家,所以沒有把數(shù)據(jù)搞活。大體把資源分成三部分其中再細(xì)分到每年、每月、每星期,一個(gè)文件夾存放圖片資源,一個(gè)文件夾存放具體某個(gè)產(chǎn)品的JSON文件,一個(gè)文件夾存放獲取所有產(chǎn)品的JSON文件。下面是自己編的JSON文件,因?yàn)榭紤]他們要用CoreText排版,(暫時(shí),UI他們負(fù)責(zé)),就把文章按段落分開了,感覺不太妥但又毫無辦法(每次我在他們面前提起,然后就沒有然后了)。
產(chǎn)品列表JSON
{
"products" : [
{
"title" : "從0到1的團(tuán)隊(duì)",
"description" : "",
"productContentURL" : "ArticleJSON/1508/4/0825.json",
"productImageURL" : "ProductImage/1508/4/101.png",
"date" : "20150825"
},
{
"title" : "還在叫她多喝水嗎",
"description" : "",
"productContentURL" : "ArticleJSON/1508/4/0826.json",
"productImageURL" : "ProductImage/1508/4/201.png",
"date" : "20150826"
},
{
"title" : "喵星人的窩也傲嬌",
"description" : "",
"productContentURL" : "ArticleJSON/1508/4/0827.json",
"productImageURL" : "ProductImage/1508/4/301.png",
"date" : "20150827"
},
{
"title" : "你以為 這是水瓢嗎",
"description" : "",
"productContentURL" : "ArticleJSON/1508/4/0828.json",
"productImageURL" : "ProductImage/1508/4/401.png",
"date" : "20150828"
},
{
"title" : "有一只碗 它的名字叫做初心",
"description" : "",
"productContentURL" : "ArticleJSON/1508/4/0829.json",
"productImageURL" : "ProductImage/1508/4/501.png",
"date" : "20150829"
}
]
}具體某個(gè)產(chǎn)品JSON
{
"title" : "從0到1的團(tuán)隊(duì)",
"contents" : [
{"image" : 0},
{"subTitle" : "關(guān)于我們"},
{"detail" : "從這個(gè)微信平臺(tái)建立的第一天起,我一直在想,第一篇推文,我要說點(diǎn)什么。"},
{"detail" : "幾個(gè)素未謀面的人,面對(duì)現(xiàn)實(shí)的銅墻鐵壁,赤手空拳,卻熱情滿滿。"},
{"detail" : "【產(chǎn)品經(jīng)理】聽說一開始這是極客班的一個(gè)產(chǎn)品勾搭項(xiàng)目,明明可以靠臉卻偏偏要靠實(shí)力的產(chǎn)品經(jīng)理阿酸憑借獨(dú)特的創(chuàng)意和強(qiáng)大的忽悠能力成功勾搭了IOS班的幾個(gè)程序猿大師…"},
{"detail" : "【攻城獅1號(hào)】噔噔噔,汪星人紅雷哥閃亮登場(chǎng)!如果你以為程序員只會(huì)在深夜里擼代碼,那你就錯(cuò)了。自從紅雷哥在“簡(jiǎn)書”上發(fā)表了關(guān)于我們團(tuán)隊(duì)的一篇文章“從0到1的團(tuán)隊(duì)”,我就感覺到我的文案狗地位岌岌可危了…"},
{"detail" : "【攻城獅2號(hào)】第一次語(yǔ)音會(huì)議聽到餅仙超級(jí)好聽的普通話就自行腦補(bǔ)是一個(gè)帥小伙(此處應(yīng)該有口水…),發(fā)言不多然而句句重點(diǎn),情商與智商兼?zhèn)涞哪秀y?。。。ㄠ藓孟襁€只是個(gè)即將大三的男生…)"},
{"detail" : "【攻城獅3號(hào)】被紅雷哥的那篇“從0到1的團(tuán)隊(duì)”吸引而來中途加入?yún)s有勇有謀的江先生(然而他并不姓江…),家住海邊一天三餐都吃魚的渴望自己的技術(shù)筆記能和勵(lì)志雞湯一樣獲贊無數(shù)的明星主編…"},
{"image" : 1},
{"detail" : "【財(cái)務(wù)總監(jiān)】傲嬌一根筋的財(cái)務(wù)小王子光哥,目前團(tuán)隊(duì)沒半分錢管理卻是阿酸的得力助手,出主意打下手無怨無悔(然而聽說產(chǎn)品經(jīng)理是他的小粉絲…)。"},
{"detail" : "【設(shè)計(jì)師】實(shí)習(xí)工資不高工作時(shí)間卻很長(zhǎng),超級(jí)負(fù)責(zé)任的美女設(shè)計(jì)師!什么?你問我沒見過怎么知道是美女?我只能回答你學(xué)設(shè)計(jì)的一般都不會(huì)長(zhǎng)的太差…"},
{"detail" : "【文案編輯】入了這一行才知道行行都是坑的文案狗正在默默碼字當(dāng)中,還要被紅雷哥催稿簡(jiǎn)直天理難容!嗯哼沒錯(cuò)這個(gè)人就是我…"},
{"detail" : "【Zerone零一】“零一”是我們的團(tuán)隊(duì)名字,“Zerone”是英文名。當(dāng)阿酸宣布這個(gè)名字的時(shí)候,紅雷哥說查一下有沒有人用過了。阿酸說:“哈哈沒關(guān)系啊馬云成名前也有很多個(gè)人叫做馬云?!编逈]錯(cuò)就是這么傲嬌…"},
{"image" : 2},
{"subTitle" : "關(guān)于1Percent"},
{"detail" : "1Percent這個(gè)名字的確定經(jīng)歷了蠻激烈的討(si)論(bi),畢竟,重要的東西都來之不易。1Percent,很多人第一直覺就是“什么鬼?”,然而要告訴你這不是鬼,而是一個(gè)活脫脫的優(yōu)質(zhì)生活用品推薦平臺(tái)。接下來請(qǐng)自動(dòng)切換小清(zhuang)新(bi)閱讀模式…"},
{"detail" : "【聽】一個(gè)閑適的午后,陽(yáng)光傾瀉而下,坐在窗邊,淡雅的桌布,精致的杯具,牛皮色的筆記本,一顆自由的心…你所能想象到的,這里都會(huì)為你呈現(xiàn)。每日推薦優(yōu)質(zhì)生活用品,讓精致的生活不再只是“聽”說。"},
{"image" : 3},
{"detail" : "【說】“這世界上一定有另一個(gè)我,做著我不敢做的事情,過著我想過的生活?!蹦阋欢]有想過,你以為的平淡無奇,也許是別人夢(mèng)寐以求的生活。在這里,你可以盡情大膽地“說”出自己喜歡用的好東西,和大家一起分享屬于你的優(yōu)質(zhì)生活。"},
{"detail" : "【1Percent】這是一個(gè)致力于為您推薦優(yōu)質(zhì)生活用品的平臺(tái),用1%的視角,品味99%的生活。"},
{"image" : 4},
{"subTitle" : "最后"},
{"detail" : "我們這樣一群人,也曾孤獨(dú)地立在車水馬龍中不知身在何方,也曾昏睡一天后一碗泡面打發(fā)人生,也曾隨意對(duì)待生活面目可憎。今天看到一句話:“世俗的眼光,現(xiàn)實(shí)的殘忍,讓你不得不按部就班,朝九晚五,只因我們都太害怕和別人不一樣了?!?},
{"detail" : "那么,盲目也好,任性也罷。就讓我們做點(diǎn)不一樣的事情吧。人生苦短,難道你還要繼續(xù)辜負(fù)下去嗎?"},
{"ending" : "我所理解的生活\n 就是掃一掃 加入我們"}
],
"images" : [
{
"imageURL" : "ProductImage/1508/4/101.png",
"imageWidth" : "",
"imageHeight" : ""
},
{
"imageURL" : "ProductImage/1508/4/102.png",
"imageWidth" : "",
"imageHeight" : ""
},
{
"imageURL" : "ProductImage/1508/4/103.png",
"imageWidth" : "",
"imageHeight" : ""
},
{
"imageURL" : "ProductImage/1508/4/104.png",
"imageWidth" : "",
"imageHeight" : ""
},
{
"imageURL" : "ProductImage/1508/4/105.png",
"imageWidth" : "",
"imageHeight" : ""
}
],
"creationTime" : "20150825",
"editor" : "仙子",
"pictureProduction" : "畫家 Yuliya"
}
我把這些JSON文件做了模板,希望編輯手可以按照這些簡(jiǎn)單的規(guī)則,把文章按段落填入空中,把圖片按排列順序填上資源路徑。然而她拒絕了我,她居然拒絕了我 ?。?!

完結(jié)
服務(wù)器數(shù)據(jù)總算搞定了,那只要對(duì)數(shù)據(jù)封裝成數(shù)據(jù)業(yè)務(wù)層交給他倆就OK了。數(shù)據(jù)業(yè)務(wù)層主要負(fù)責(zé)獲取數(shù)據(jù),至于來自硬盤還是網(wǎng)絡(luò)不需要UI工程師知道。在網(wǎng)絡(luò)請(qǐng)求圖片數(shù)據(jù)時(shí)對(duì)tableViewCell的滾動(dòng)做了請(qǐng)求優(yōu)化(請(qǐng)求還沒落地時(shí)不再發(fā)起請(qǐng)求,如果內(nèi)存中有在內(nèi)存中?。┢渲袌D片也做了內(nèi)存緩存,做硬盤緩存大概不難。難點(diǎn)在于要把它抽象成模塊,SDWebImage有時(shí)間真要好好研究才行。