跳转至

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有高质量项目
□ 发表过论文(即使是合作)
□ 参加过学术会议
□ 了解公司的研究方向
□ 能用英文交流(外企)

# 面试后
□ 发感谢邮件
□ 记录面试问题(下次用)
□ 复盘不好的回答