Appomni招聘Golang高级/资深软件工程师
Appomni招聘Golang高级/资深软件工程师 作为威胁检测工程团队的高级后端软件工程师,您将直接为AppOmni的SaaS安全态势管理(SSPM)平台的主要组件做出贡献。与技术领导层合作,您将负责设计和开发代码库的主要领域,这些领域实现了安全检测能力,以支持客户改善其安全态势。
这家快速发展的安全工程公司的这个职位,是一个掌握重大工程决策和技术实施所有权的机会,这些技术不仅将提高企业SaaS部署的安全性,也将保护其客户和最终用户。
您的工作将对保护我们的客户及其数据(其中可能包括您自己的数据!)产生直接而有意义的影响。这些是安全行业激动人心的领域中具有挑战性的工程问题,目前尚无既定解决方案。成功的候选人将拥有强大的问题解决能力历史,以及创造性思维与一流工程技能相结合的能力。
您需要具备
- 5年以上软件开发经验,其中重点关注Golang。
- 精通使用gRPC构建微服务。
- 在设计、构建和维护ETL管道方面有经验,最好是为事件/审计日志安全检测服务。
- 熟悉消息队列,特别是PubSub、Kafka或Pulsar。
- 有实施和管理OLAP和OLTP数据库的经验,确保最佳性能和可靠性。
- 有使用CI/CD工具进行部署自动化的经验。
- 具备在团队环境中工作并指导经验不足的团队成员的能力。
- 出色的技术和非技术沟通能力。
您可能还具备
- 熟悉Python3和/或Rust
- 有安全运营经验
- 有使用Kubernetes和Terraform管理基础设施的经验;特别是在Google Cloud Platform上。
您将使用的技术
- Golang
- Python3
- PubSub
- BigQuery
- Redis
- Postgres
- Google Cloud Platform + Google Kubernetes Engine
我们提供
一家灵活、远程优先的公司,拥有一支才华横溢的团队,他们乐于解答问题,以高质量标准为指引,致力于自我提升和个人成长。我们以开放的心态接纳新的想法和方法。提供有竞争力的薪资和福利选择,以及巨大的职业发展机会和支持。
文化
我们相信培养卓越——在我们自身内部,以及在我们所做的工作中。我们这支以客户为中心、数据驱动的专家团队因共同的热情而聚集在一起:为更大的利益创造工具。我们决心有所作为,通过保护正在改变世界的技术,积极影响我们的生活方式。
我们相信成为客户值得信赖和透明的合作伙伴,我们热衷于为他们提供高质量、可用且可靠的软件,这些软件专注于人的体验,源于合作竞争的文化以及对客户需求和目标的深刻理解。
我们重视激情、勇气和善良。我们也知道杰出的人才并非只存在于一个地方。我们的团队——云软件、安全初创公司、国际旅游品牌以及一些最大的科技巨头的资深人士——从科罗拉多州的山脉到旧金山和纽约市的天际线,遍布各地。
我们重视我们的员工,并深知健康的工作/生活平衡能让他们茁壮成长并展现出最佳状态。自主安排时间、灵活通勤以及无需打卡的自由,意味着我们的团队能够享受生活,在灵感迸发时工作,并在需要时随时待命。
关于AppOmni
AppOmni是SaaS安全管理软件的领先提供商。该公司由来自顶级SaaS提供商和网络安全供应商的安全资深人士团队创立,其客户群包括全球科技、医疗保健、银行和金融领域的领导者,以及许多最知名的网络安全提供商。
AppOmni的专利技术扫描API、安全控制和配置设置,将企业SaaS部署的当前状态与最佳实践和业务意图进行比较。该解决方案提供快速部署和即时可见性,并使安全和IT团队能够轻松地保护其整个SaaS环境,从每个供应商到每个最终用户。随着SaaS应用程序的发展,AppOmni会紧跟所有更新和发布,以长期保持客户环境的安全。

AppOmni是一个提供平等机会的雇主。申请人不会因为种族、肤色、信仰、■■■、性取向、性别认同或表达、年龄、宗教、国籍、公民身份、残疾、血统、婚姻状况、退伍军人身份、健康状况或任何受地方、州或联邦法律保护的类别而受到歧视。
请在此处申请:
更多关于Appomni招聘Golang高级/资深软件工程师的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于Appomni招聘Golang高级/资深软件工程师的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
这是一个非常典型的Golang高级/资深工程师职位描述,专注于云原生、微服务和数据处理。从技术栈来看,这是一个典型的现代Go后端架构岗位。
核心职责分析: 这个职位要求工程师负责构建和维护一个用于安全检测的ETL管道,处理来自SaaS应用的事件和审计日志。技术栈表明这是一个运行在GCP上的事件驱动微服务架构。
关键技术点示例:
-
gRPC微服务: 团队内部服务间通信很可能重度依赖gRPC。
// 示例:一个简单的gRPC服务定义和实现片段 // protobuf 定义 (api/v1/detector.proto) // service DetectionService { // rpc AnalyzeLog(LogBatch) returns (DetectionResult); // } // Go 服务端实现 package main import ( "context" "log" "net" pb "yourproject/api/v1" "google.golang.org/grpc" ) type server struct { pb.UnimplementedDetectionServiceServer } func (s *server) AnalyzeLog(ctx context.Context, in *pb.LogBatch) (*pb.DetectionResult, error) { // 实现核心检测逻辑,处理日志批次 log.Printf("Received batch ID: %s, Log count: %d", in.BatchId, len(in.Logs)) // ... 进行威胁检测分析 ... return &pb.DetectionResult{ BatchId: in.BatchId, Findings: []*pb.SecurityFinding{ /* ... */ }, }, nil } func main() { lis, err := net.Listen("tcp", ":50051") if err != nil { log.Fatalf("failed to listen: %v", err) } s := grpc.NewServer() pb.RegisterDetectionServiceServer(s, &server{}) log.Printf("gRPC server listening at %v", lis.Addr()) if err := s.Serve(lis); err != nil { log.Fatalf("failed to serve: %v", err) } } -
Pub/Sub事件处理: 日志很可能通过Cloud Pub/Sub进行异步传输。
// 示例:使用Google Cloud Pub/Sub客户端库消费消息 import ( "context" "fmt" "sync" "cloud.google.com/go/pubsub" ) func consumeLogs(projectID, subID string) error { ctx := context.Background() client, err := pubsub.NewClient(ctx, projectID) if err != nil { return fmt.Errorf("pubsub.NewClient: %v", err) } defer client.Close() sub := client.Subscription(subID) // 使用回调函数处理收到的消息 cctx, cancel := context.WithCancel(ctx) defer cancel() err = sub.Receive(cctx, func(ctx context.Context, m *pubsub.Message) { // 将消息数据(可能是审计日志)传递给处理管道 fmt.Printf("Processing message ID: %s, Data: %s\n", m.ID, string(m.Data)) // ... 这里可以调用gRPC服务或直接进行ETL处理 ... m.Ack() // 确认消息已处理 }) if err != nil { return fmt.Errorf("Receive: %v", err) } return nil } -
ETL管道与数据库操作: 需要将处理后的数据写入BigQuery(OLAP)和Postgres(OLTP)。
// 示例:使用Go向BigQuery插入流数据 import ( "cloud.google.com/go/bigquery" "context" ) func insertFindingToBQ(ctx context.Context, projectID, datasetID, tableID string, finding *SecurityFinding) error { client, err := bigquery.NewClient(ctx, projectID) if err != nil { return err } defer client.Close() inserter := client.Dataset(datasetID).Table(tableID).Inserter() // 假设SecurityFinding结构体已添加BigQuery标签 items := []*SecurityFinding{finding} if err := inserter.Put(ctx, items); err != nil { return err } return nil }
架构推断: 典型的流程可能是:各种SaaS审计日志 -> Pub/Sub -> Go微服务(消费、解析、丰富) -> 检测引擎(Go核心逻辑) -> 结果写入 Postgres(用于实时查询/仪表盘)和 BigQuery(用于历史分析和机器学习)。Redis 可能用于缓存配置、规则或会话状态。整个系统通过 GKE 容器化部署,使用 Terraform 进行基础设施即代码管理。
这个职位要求候选人不仅要有扎实的Go编码能力,还要对云原生数据流水线的设计、性能和可靠性有深入的理解。技术栈组合(Go, GCP, Pub/Sub, BigQuery)在硅谷专注于数据处理的安全或数据分析公司中非常常见。

