技术知识导图

硬件

  • CPU、内存、总线、I/O

操作系统

  • 对硬件资源封装,对外提供基础服务。
  • 内核、网络、进程/线程、文件、显示、其他各种硬件驱动。
  • 提供系统库,内核态/用户态。
  • 跨平台接口 POSIX

驱动开发/嵌入式开发

编程语言

  • C/C++、OC、Java、JS、Swift、Kotlin、Python、PHP、Dart。
  • 类型、集合、字符串、控制流、运算、函数/闭包/Lambada、结构体/类/枚举、方法/属性、接口/协议、继承、扩展、泛型、协程。
  • 编程范式:面向过程、面向对象、面向切片、函数反应式。
  • AOT/JIT、解释执行、编译执行。
  • 由系统直接运行还是在虚拟机上运行。
  • 代码编译、代码转换。

数据结构和算法

网络

数据库

设计模式和架构

分布式系统

虚拟机/容器技术

大数据

云计算

人工智能

服务端开发

PC客户端&Web

移动客户端&Web&小程序

基础能力建设

  • 通用能力,框架设计、网络、存储、图片、音视频、日志、配置、路由、数据管理/消息总线、H5容器、硬件能力、数据绑定。
  • UI能力,UI组件、布局、渲染、动画、主题。
  • 动态化能力,JSON组件、Weex/RN、Hybrid H5、Flutter。

上层业务解藕

  • 登录、分享、支付、广告、导购、下单、订单、售后、用户。

研发体系

  • webpack,脚手架
  • CI、包管理、ESLint/OSLint
  • 缺陷管理
  • 功能测试、性能测试、集成测试

运营体系

  • 大盘数据、ABTest、营销系统

运维体系

  • 渠道发布、数据监控

视频/游戏

AR/VR

2019/3/13 posted in  临时

React Native

  • https://juejin.im/post/5a6460f8f265da3e4f0a446d React Native for Android 原理分析与实践:实现原理

  • https://www.cnblogs.com/android-blogs/p/5623481.html 其实没那么复杂!探究react-native通信机制

  • Native与JS之间调用方式,Bridge。

  • 在jsi.h中Runtime抽象类,申明了JS执行已经与Native互调的接口。在iOS和Android中分别实现。iOS的JSCRuntime,直接调用iOS系统提供JavaScriptCore框架。Android则额外引入jsc.so包提供,JavaScriptCore的功能。

  • Native和JS两端都保存模块、方法数据的注册表。

  • 通道优化,JS调用Naitve,先push到MessageQueue,等Native有调用时,顺带批量返回(如果5毫秒内,没有Native调用事件,则主动flush queue)。

  • JS代码执行,Native与JS消息通信等都是通过该Bridge进行。

2019/3/12 posted in  临时

Swift

  • basic types
  • operators
  • strings & collections
  • flow control
  • method & closure
  • structure & class
  • enumeration
  • extension & protocol
  • optional chaining
  • generics
  • memory
  • access safety
  • error handle
2019/3/4 posted in  临时

技术

  • 技术、框架、功能都是为了解决某个问题、帮助某个业务而出现,在实现的选择上,有可能会受到当时场景、条件等各种因素影响,在当时可能是最优的选择,但也可能存在些副作用。
  • 更看重长期的收益,在短期上,可能需要额外付出,需要投入人力、物力。
  • 技术、框架、方案会过时,也许有些技术能存在很长时间,适应很多变化,但在新需求、新环境面前,总会有些心有余力不足。这时要么还在原来基础上修修补补,要么革就出新,刨除历史包袱,作出新的变革。
2019/3/1 posted in  临时

Swift

Pods

2019/2/12 posted in  临时

苹果开发文档

2019/2/11 posted in  临时

iOS Mach-O

/**
 * Created by BeeHive.
 * Copyright (c) 2016, Alibaba, Inc. All rights reserved.
 *
 * This source code is licensed under the GNU GENERAL PUBLIC LICENSE.
 * For the full copyright and license information,please view the LICENSE file in the root directory of this source tree.
 */


#import "BHAnnotation.h"
#import "BHCommon.h"
#include <mach-o/getsect.h>
#include <mach-o/loader.h>
#include <mach-o/dyld.h>
#include <dlfcn.h>
#import <objc/runtime.h>
#import <objc/message.h>
#include <mach-o/ldsyms.h>

NSArray<NSString *>* BHReadConfiguration(char *sectionName,const struct mach_header *mhp);
static void dyld_callback(const struct mach_header *mhp, intptr_t vmaddr_slide)
{
    NSArray *mods = BHReadConfiguration(BeehiveModSectName, mhp);
    for (NSString *modName in mods) {
        Class cls;
        if (modName) {
            cls = NSClassFromString(modName);
            
            if (cls) {
                [[BHModuleManager sharedManager] registerDynamicModule:cls];
            }
        }
    }
    
    //register services
    NSArray<NSString *> *services = BHReadConfiguration(BeehiveServiceSectName,mhp);
    for (NSString *map in services) {
        NSData *jsonData =  [map dataUsingEncoding:NSUTF8StringEncoding];
        NSError *error = nil;
        id json = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error];
        if (!error) {
            if ([json isKindOfClass:[NSDictionary class]] && [json allKeys].count) {
                
                NSString *protocol = [json allKeys][0];
                NSString *clsName  = [json allValues][0];
                
                if (protocol && clsName) {
                    [[BHServiceManager sharedManager] registerService:NSProtocolFromString(protocol) implClass:NSClassFromString(clsName)];
                }
                
            }
        }
    }
    
}
__attribute__((constructor))
void initProphet() {
    _dyld_register_func_for_add_image(dyld_callback);
}

NSArray<NSString *>* BHReadConfiguration(char *sectionName,const struct mach_header *mhp)
{
    NSMutableArray *configs = [NSMutableArray array];
    unsigned long size = 0;
#ifndef __LP64__
    uintptr_t *memory = (uintptr_t*)getsectiondata(mhp, SEG_DATA, sectionName, &size);
#else
    const struct mach_header_64 *mhp64 = (const struct mach_header_64 *)mhp;
    uintptr_t *memory = (uintptr_t*)getsectiondata(mhp64, SEG_DATA, sectionName, &size);
#endif
    
    unsigned long counter = size/sizeof(void*);
    for(int idx = 0; idx < counter; ++idx){
        char *string = (char*)memory[idx];
        NSString *str = [NSString stringWithUTF8String:string];
        if(!str)continue;
        
        BHLog(@"config = %@", str);
        if(str) [configs addObject:str];
    }
    
    return configs;

    
}

@implementation BHAnnotation

@end



__attribute__((constructor)) void before_main() {
    printf("--- %s\n", __func__);
}

__attribute__((destructor)) void after_main() {
    printf("--- %s\n", __func__);
}


2019/2/11 posted in  临时

HTTP2

HTTP,HTTP2.0,SPDY,HTTPS你应该知道的一些事 http://www.alloyteam.com/2016/07/httphttp2-0spdyhttps-reading-this-is-enough/

HTTP/2 新特性总结 https://www.jianshu.com/p/67c541a421f9

  • http2能带来如下这些收益:
    1、多路复用、多个HTTP可以在同个TCP连接上同时发送。
    2、优先级
    3、header压缩
    4、Server Push
2019/2/1 posted in  临时

对开发的思考

开发环节

  • 开发、集成、测试、部署、运维

如何协同,解藕、组件化、平台化

  • 研发平台
  • 运维平台
  • 营销平台

衡量

  • 效率、质量 -> 效能、价值

网络

  • 移动网关
  • HTTP DNS
  • 直连、加速
  • HTTP/2
  • 加密、压缩
  • 业务接口协议
  • 代理、Mock、Debug、测试、诊断
  • 长连接
  • 推送
  • 服务端、客户端二方包

存储

  • 关系数据存储
  • 非关系数据存储
  • 缓存
  • 读写分离
  • mmap

图片

  • 图片格式
  • 域名收敛
  • CDN
  • 图片质量、大小
  • 渐进式
  • 失败率

视频

  • 格式
  • 云存储、本地存储
  • 视频播放
  • 视频流
  • 弹幕

日志

  • 本地日志
  • 远程日志
  • 聚合

统计

调试工具

Web容器

设计模式&架构

动态化方案

UI框架

  • 组件库
  • 页面模式

三方业务

  • 支付
  • 分享
  • OAuth登录
  • 推送
  • 地图
  • 直播

自有业务

  • 登录
  • 电商
  • 营销
2019/2/1 posted in  临时

UI框架、编程范式

移动客户端、H5、小程序

  • iOS native编码、Android native编码、Weex方案、React Native方案、小程序的mpvue方案、小程序的wepy方案

iOS UI编码方式

  • 使用Objective-C/Swift构建基于ViewController的原生页面。

Android UI编码方式

  • Java、AndroidSDK、kotlin
  • Activity/Flagment + XML构建原生页面。

Weex/RN

  • DSL转换打包成Bundle,部署下发的目标环境上,在Weex引擎或RN引擎上运行,桥接到原生的UI框架。

DSL -- transform --> bundle -- distribution --> run in engine --> adaptor layer (bridge with native / render in native)

2019/1/30 posted in  临时

美团2018技术合集 阅读笔记

mpvue

https://tech.meituan.com/2018/03/11/mt-mpvue-development-framework.html

  • 使用vue.js开发小程序
  • 原理:增加一个中间层,将小程序的生命周期、事件、数据同步等桥接到vue对象。

Flutter

https://tech.meituan.com/2018/08/09/waimai-flutter-practice.html

  • 全新思路的跨平台的移动客户端UI方案。
  • 不同于Weex或ReactNative将JS数据代理到Native UI库做渲染,Flutter直接使用更加底层的图形渲染接口,从更底层去接管消息事件,在此基础上,封装跨平台的UI库。
  • 对于UI层来说,这样的跨平台更彻底,一致性更强。
  • 核心引擎+Widget库

Picasso 大众点评自研的Native动态化方案

https://tech.meituan.com/2018/06/21/picasso-the-future.html

  • 对比

Hybrid WebView
Weex、RN、Flutter

  • 基本原理
    DSL(TypeScript)-》 PModel -〉 iOS、Android、H5、小程序渲染引擎 -》 UI

  • DSL

  • 核心SDK + 适配层 + 脚手架

  • 开发流程

VSCode + 插件

  • 发布流程

Picasso文件 -〉JS Bundle -》 部署服务器 -〉Picasso执行环境(iOS、Android、H5、小程序)-》渲染引擎

美团客户端响应式框架Easy React

https://tech.meituan.com/2018/07/19/react-programming-framework-easyreact-opensource.html

  • 对比ReactiveCocoa、ReactiveX
  • 基于Objective-C
  • EasyMVVM

Logan:美团点评的开源移动端基础日志库 - 美团技术团队

https://tech.meituan.com/2018/10/11/logan-open-source.html

MCI:移动持续集成在大众点评的实践

https://tech.meituan.com/2018/07/12/mci.html

美团外卖Android Crash治理之路

https://tech.meituan.com/2018/06/14/waimai-android-crash.html

运营平台

  • 运营、平台管理、前端开发
  • 同一个运营位,多维度内容的展示。
  • 运营效果

监控系统

HTTP服务治理框架

2019/1/29 posted in  临时

开发笔记

微服务

单体到微服务是一个演化过程,别在一开始就过度设计

“ The Art of Scalability ”一书描述了一种 三维可伸缩性模型 (AKF Scale Cube),其中三个轴分别代表了不同类型的缩放:

X:水平复制和克隆;-> (Docker,容器)
Y:功能分解和分割(微服务);
Z:水平数据分区(分片)。

微服务架构设计

微服务架构设计

vue

https://juejin.im/post/5c488a3cf265da615705cc2a?utm_source=tuicool&utm_medium=referral

社交

Tumblr、Pinterest……一个个想创造新模式的应用都失败了,它们改变了什么又为何没落? | 好奇心商业史

https://www.qdaily.com/articles/60688.html?utm_source=tuicool&utm_medium=referral

三个软件可能要被整合到一起:WhatsApp、Instagram和Facebook Messenger

https://www.qdaily.com/articles/60669.html

数据垄断和信息孤岛,是如何驯化我们的?
https://www.huxiu.com/article/282751.html?utm_source=tuicool&utm_medium=referral

2019/1/22 posted in  临时

研发体系-》开发、测试
监控体系-〉多维度监控
系统架构

2019/1/17 posted in  临时

java的gc检查内存回收时,使用有向图机制,及检查一个或一组对象的可达性。如果是不可达状态,则将该对象从内存中回收,所谓不可达状态,也就是一个对象不被任何引用所指向或者叫持有。
另外,java的循环引用不同于oc或者c++,当一组对象中只包含互相的引用,而没有来自它们外部的引用(例如有两个对象A和B互相持有引用,但没有任何外部对象持有指向A或B的引用),这仍然属于不可到达,同样会被GC回收。

2019/1/15 posted in  临时