862. 生信面试终极攻略
一句话概述:生信面试 = 技术深度(60%) + 项目经验(25%) + 软实力(15%)——准备好"你做了什么、为什么这样做、结果怎样"这三个问题的答案,就赢了一半。
核心知识点速查表
| 面试环节 | 考察内容 | 准备重点 |
|---|
| 技术笔试 | 编程+算法+生信知识 | Python/R + 常用工具原理 |
| 技术面试 | 项目深挖+概念理解 | 项目细节+为什么这样做 |
| 编程面试 | 现场写代码 | LeetCode + Rosalind |
| 行为面试 | 沟通+团队+解决问题 | STAR方法讲故事 |
| 文献讨论 | 论文理解和批判性思维 | 准备2-3篇经典论文 |
一、高频技术问题TOP30
# === 生信面试高频技术问题(2025-2026版)===
# ========== 基础概念 ==========
# Q1: RNA-seq分析的基本流程是什么?
"""
答案框架:
1. 质控(FastQC/fastp) → 2. 比对(STAR/HISAT2) →
3. 定量(featureCounts/HTSeq) → 4. 差异分析(DESeq2/edgeR) →
5. 功能富集(GO/KEGG)
关键细节:
- 比对前看Q30>80%、adapter残留
- DESeq2用Wald检验,edgeR用似然比检验
- 多重检验校正用BH方法(FDR<0.05)
"""
# Q2: 什么是P值?什么是FDR?
"""
P值 = 假设没有差异(H0为真)时,观察到当前结果的概率
白话: 如果这个基因真的没差异,出现这么大差异的概率有多小
FDR = False Discovery Rate = 预期假阳性比例
白话: 在你找到的100个差异基因中,预期有多少是假的
为什么要FDR:检测20000个基因,P<0.05意味着期望1000个假阳性
BH校正后FDR<0.05:100个差异基因中预期只有5个假阳性
"""
# Q3: BWA和STAR的区别?
"""
BWA: DNA比对,不处理剪接
- 适合WGS/WES/ChIP-seq
- 算法: BWT + FM-index
STAR: RNA比对,能跨越剪接位点
- 适合RNA-seq
- 需要基因注释文件(GTF)
- 内存需求大(30-50GB)
选择原则: DNA用BWA,RNA用STAR
"""
# Q4: 什么是批次效应?怎么处理?
"""
批次效应 = 不同批次实验之间的系统性差异(不是生物学差异)
例如: 不同天提取RNA、不同人操作、不同批次试剂
处理方法:
1. 实验设计: 每个批次都包含对照和实验组
2. 统计方法: DESeq2中加入batch作为协变量
3. 校正工具: ComBat(sva包), Harmony(单细胞)
4. 可视化: PCA看批次效应是否消除
"""
# Q5: 什么是GC偏差?有什么影响?
"""
GC偏差 = GC含量极端的区域测序覆盖度异常
原因: PCR扩增偏好(高GC和低GC区域扩增效率低)
影响:
- 基因定量不准确
- 变异检测灵敏度下降
解决:
- 使用PCR-free文库
- 用工具校正(如Salmon的GC偏差校正)
"""
# ========== 工具与流程 ==========
# Q6: GATK变异检测流程的主要步骤?
"""
1. 比对(BWA-MEM) → sorted BAM
2. 标记重复(MarkDuplicates)
3. BQSR(碱基质量重校准)
4. HaplotypeCaller → gVCF
5. GenotypeGVCFs → 联合VCF
6. VQSR(变异质量重校准) 或 硬过滤
"""
# Q7: DESeq2和edgeR有什么区别?
"""
共同点: 都用负二项分布建模RNA-seq计数数据
DESeq2:
- 使用Wald检验或似然比检验
- 对离群值更鲁棒(Cook距离过滤)
- 样本量少时推荐
edgeR:
- 使用拟似然和广义线性模型
- 计算速度更快
- 适合复杂实验设计
选择: 两个都可以,结果高度一致,DESeq2更常用
"""
# Q8: 宏基因组分析的两种主要策略?
"""
1. 基于reads的分析(无需组装):
- 物种注释: Kraken2/MetaPhlAn4
- 功能注释: HUMAnN3
- 优势: 快速,不依赖组装质量
2. 基于组装的分析:
- 组装: MEGAHIT/metaSPAdes
- 分箱: MetaBAT2/MaxBin2/CONCOCT
- 基因预测: Prodigal/MetaGeneMark
- 优势: 获得完整基因组(MAGs)
选择: 看目标。快速物种组成用reads法,
需要完整基因组用组装法
"""
二、编程面试常考题
# === 编程面试题精选 ===
# 题1: 统计FASTA文件中的GC含量
def gc_content(fasta_file):
"""计算FASTA文件中每条序列的GC含量"""
results = {} # 结果字典
current_id = None # 当前序列ID
current_seq = [] # 当前序列
with open(fasta_file) as f: # 打开文件
for line in f:
line = line.strip() # 去除换行符
if line.startswith(">"): # 序列头
if current_id: # 保存上一条序列
seq = "".join(current_seq)
gc = (seq.count("G") + seq.count("C")) / len(seq)
results[current_id] = round(gc, 4)
current_id = line[1:] # 新序列ID
current_seq = [] # 清空序列
else:
current_seq.append(line.upper()) # 收集序列
# 处理最后一条序列
if current_id:
seq = "".join(current_seq)
gc = (seq.count("G") + seq.count("C")) / len(seq)
results[current_id] = round(gc, 4)
return results
# 题2: 反向互补序列
def reverse_complement(dna):
"""返回DNA序列的反向互补"""
complement = {"A": "T", "T": "A", # 互补配对
"G": "C", "C": "G",
"N": "N"}
return "".join(complement[base] # 互补
for base in reversed(dna)) # 反向
# 题3: 找ORF(开放阅读框)
def find_orfs(dna, min_length=100):
"""找出DNA序列中所有ORF"""
start_codon = "ATG" # 起始密码子
stop_codons = {"TAA", "TAG", "TGA"} # 终止密码子
orfs = [] # ORF列表
for frame in range(3): # 3个阅读框
i = frame
while i < len(dna) - 2:
codon = dna[i:i+3] # 当前密码子
if codon == start_codon: # 找到起始
for j in range(i+3, len(dna)-2, 3):
if dna[j:j+3] in stop_codons: # 找到终止
orf_len = j - i + 3
if orf_len >= min_length: # 长度过滤
orfs.append({
"start": i,
"end": j+3,
"length": orf_len,
"frame": frame+1
})
break
i += 3
return orfs
# 题4: 解析VCF文件统计变异类型
def count_variant_types(vcf_file):
"""统计VCF文件中SNP和INDEL的数量"""
snp_count = 0 # SNP计数
indel_count = 0 # INDEL计数
with open(vcf_file) as f:
for line in f:
if line.startswith("#"): # 跳过注释行
continue
fields = line.strip().split("\t")
ref = fields[3] # REF碱基
alt = fields[4] # ALT碱基
for allele in alt.split(","): # 多等位基因
if len(ref) == 1 and len(allele) == 1:
snp_count += 1 # 长度相等=SNP
else:
indel_count += 1 # 长度不等=INDEL
return {"SNP": snp_count, "INDEL": indel_count}
三、项目经验讲述模板
# === STAR方法讲项目经验 ===
# S(Situation): 背景是什么
# T(Task): 你的任务是什么
# A(Action): 你做了什么
# R(Result): 结果怎样
# 示例:宏基因组项目
project_story = """
S(背景):
我们实验室研究2型糖尿病与肠道菌群的关系,
有一批来自GEO数据库的宏基因组测序数据,
包含T2D患者和健康对照各50例。
T(任务):
我负责整个生物信息学分析流程的搭建和执行,
目标是识别与T2D相关的关键微生物标志物。
A(行动):
1. 用fastp做质控,去除低质量reads和人类基因组污染
2. 用MetaPhlAn4做物种组成分析
3. 用LEfSe做差异物种分析
4. 用HUMAnN3做功能通路分析
5. 用随机森林建立分类模型(AUC=0.85)
6. 用SHAP解释模型特征重要性
R(结果):
发现5个属水平的显著差异菌属,
其中Akkermansia在T2D组显著降低(与文献一致),
随机森林模型的交叉验证AUC达到0.85,
SHAP分析显示前5个特征解释了70%的预测能力。
"""
# 准备好被追问的细节
followup_questions = {
"为什么选随机森林而不是其他模型?":
"1. 对高维数据鲁棒 2. 内置特征重要性 3. 不需要特征缩放",
"交叉验证怎么做的?":
"5折交叉验证,重复10次,报告平均AUC和标准差",
"怎么避免过拟合?":
"1. 独立测试集 2. 交叉验证 3. 特征数远小于样本数",
"批次效应怎么处理的?":
"数据来自同一个研究,但做了PCA检查确认没有批次效应",
}
四、面试准备清单
# === 面试前准备清单 ===
# 技术准备(面试前1-2周)
□ 复习基础概念(DNA/RNA/蛋白质/中心法则)
□ 熟悉常用工具的原理和参数
□ 刷10-20道Rosalind/LeetCode题
□ 准备2-3个项目的STAR讲述
□ 复习统计学基础(P值/FDR/正态分布/假设检验)
□ 了解公司的研究方向和流程
# 项目准备
□ 能画出项目的完整流程图
□ 能解释每一步为什么这样做
□ 知道项目的局限性和改进方向
□ 准备好被追问细节的回答
□ GitHub上的项目代码能跑
# 软实力准备
□ 准备自我介绍(1分钟版和3分钟版)
□ 准备"你的优缺点"的回答
□ 准备"你为什么选这个方向"的回答
□ 准备几个反问面试官的好问题
# 面试当天
□ 提前测试网络/摄像头(远程面试)
□ 准备纸笔(画流程图用)
□ 准备好IDE(可能需要现场写代码)
□ 放松心态,不会的题说思路
五、面试常见软性问题
# === 行为面试问题 ===
behavioral_questions = {
"自我介绍": """
我叫XX,是XX大学生物信息学专业的应届生。
研究生期间主要从事宏基因组数据分析,
熟悉Linux、Python、R和常用生信工具。
毕业课题是2型糖尿病肠道菌群分析,
用随机森林建立了AUC 0.85的分类模型。
我对贵公司的XX方向很感兴趣...
""",
"为什么选生信": """
我觉得生信是连接生物学和计算机的桥梁,
能用编程技术解决生物学问题让我很有成就感。
而且随着测序成本下降,
数据分析的需求只会越来越大。
""",
"遇到困难怎么解决": """
举例:分析中遇到一个样本的比对率只有30%,
我先检查了数据质量(没问题),
然后检查了物种来源(发现样本被污染了),
最后排除了这个样本并记录在分析报告中。
流程:定位问题 → 排查原因 → 解决方案 → 记录文档
""",
"反问面试官的好问题": [
"团队目前在做什么方向的项目?",
"新人入职后的培养计划是什么?",
"团队使用什么流程管理工具?",
"对这个岗位最看重什么能力?"
]
}
常见报错与解决
| 面试常见失误 | 原因 | 改进方法 |
|---|
| 答案太长太散 | 没有结构化表达 | 用STAR方法组织答案 |
| 只说做了什么不说为什么 | 缺少深度思考 | 每步都准备"为什么"的解释 |
| 不会的题直接说不会 | 放弃太快 | 说出思路和方向,展示学习能力 |
| 紧张忘词 | 准备不足 | 多做模拟面试 |
| 代码写不出来 | 练习不够 | 刷题+限时练习 |
速查表
# 面试核心知识框架
生物学: 中心法则/测序原理/基因表达调控
工具: BWA/STAR/GATK/DESeq2/Seurat/Kraken2
编程: Python(pandas/numpy) + R(ggplot2) + Bash
统计: P值/FDR/假设检验/多重检验/回归
机器学习: 随机森林/SVM/PCA/聚类/交叉验证
# 面试回答框架
技术问题: 定义 → 原理 → 应用 → 局限性
项目问题: STAR (背景-任务-行动-结果)
编程问题: 思路 → 伪代码 → 实现 → 测试
# 加分项
□ GitHub有高质量项目
□ 发表过论文(即使是合作)
□ 参加过学术会议
□ 了解公司的研究方向
□ 能用英文交流(外企)
# 面试后
□ 发感谢邮件
□ 记录面试问题(下次用)
□ 复盘不好的回答