初代上杉景勝の執政直江兼続は元和4年（1618年）に禅林文庫を創設して足利学校や金沢文庫に匹敵する学問修行の道場とし、家臣の教育を図ろうとしたが、直江が翌年に病死したため実現までには至らなかった。第4代綱憲は将軍徳川綱吉の奨学により学問所を創設したが、以後は米沢藩の藩財政悪化により学問所自体が退廃した。このため、米沢藩で実質的に藩校が創設されるのは上杉鷹山の改革期である。鷹山は自らの師細井平洲を米沢に招聘し、師の命名で藩校は興譲館と名づけられた。規模や内容は元和や元禄の比ではなく、鷹山や細井は藩校に優秀な指導者となるべき人材の育成の役割を求め、藩校の席次は身分ではなく長幼の序で定められて場合によっては生徒に手当として年1両の手当金、寄宿代の無料などの特典もあり、この藩校の子弟が藩の中枢にあって活躍していくことになる。
1767年（明和4年）、17歳で重定の跡を継いだ養子の治憲（鷹山）は竹俣当綱と莅戸善政らを登用して藩政改革に乗り出した。倹約令発布、農村統制の強化、絹織物の専売制実施等の財政再建と、桑や漆の植樹、縮織技術の導入や黒井忠寄による灌漑事業などの殖産興業政策を行って藩財政を立て直した。また、先述のとおり特産品の青苧、紅花、蝋等も藩財政を助けた。儒学者細井平洲を招いて藩校の興譲館（現山形県立米沢興譲館高等学校）を設け、藩士の教育にもあたった。一方で、1773年（安永2年）7月には家老の須田満主や奉行の色部照長や千坂高敦らによる竹俣一派排除訴訟（七家騒動）も起こる。米沢藩では、藩主上杉家の実質上の祖である上杉謙信が藩祖として祀られ、その遺骸を納めた甕は遠く越後春日山（新潟県上越市）から米沢に運ばれて米沢城本丸内に安置されていた。上杉謙信崇拝に基づいた藩風は、越後以来の家臣の召し放ちが少なかったこともあって独特の誇り高い気風を生んだが、その一方で体面を重んじ、頑固で保守的な面があって、そのことが鷹山の藩政改革の障害となったという見方もある。しかし、鷹山隠居後も藩政改革に取り組む名君が続いたため、治憲・治広の代には借財を返済して5千両の囲い金（備蓄）を有するに至る。
米沢藩上杉家は他の藩と比較して下級武士の数が圧倒的に多かった。これは関ヶ原の戦いに敗れて所領を4分の1に削減されたにも関わらず、家臣に暇を出すことをせず、そのまま米沢に連れて来たからである。必然的に家臣ひとり当たりの知行高は低く抑えられ、のちのち上杉家そのものだけでなく家臣たちひとりひとりの極端な経済的困窮につながった。大坂の役では上杉軍は2万の軍を率いて出陣しているが、本来は30万石であるから動員できる兵力は多く見ても7500人から9000人（そもそも1万石の動員数が250人から300人）であり、上杉家は倍以上の兵を動員している勘定になる。同じ山形県内にあった庄内藩酒井家14万石の家臣は約1900人であるが、米沢藩は約5000人という数から比較しても、家臣の極端な大人数が財政難の原因のひとつとなったことは確かである。なお、上杉家の上級家臣（高家衆・奉行・家老・分領家）は95人で全体のおよそ2パーセント、中級家臣（上杉謙信の旗本だった馬廻組・上杉景勝の旗本だった五十騎組・直江兼続の与板衆）が930人で全体のおよそ19パーセント、残りが下級家臣でおよそ3900人であった。
以下の Java の例は、汎用のプログラミング言語がより特化した言語を解釈する例を、ここでは 逆ポーランド記法 を用いて示す。出力：'42 4 2 - +' equals 44import java.util.*; interface Expression {    public void interpret(Stack<Integer> s);} class TerminalExpression_Number implements Expression {    private int number;    public TerminalExpression_Number(int number)       { this.number = number; }    public void interpret(Stack<Integer> s)  { s.push(number); }} class TerminalExpression_Plus implements Expression {    public void interpret(Stack<Integer> s)  { s.push( s.pop() + s.pop() ); }} class TerminalExpression_Minus implements Expression {    public void interpret(Stack<Integer> s)  { s.push( - s.pop() + s.pop() ); }} class Parser {    private ArrayList<Expression> parseTree = new ArrayList<Expression>(); // only one NonTerminal Expression here     public Parser(String s) {        for (String token : s.split(" ")) {            if      (token.equals("+")) parseTree.add( new TerminalExpression_Plus() );            else if (token.equals("-")) parseTree.add( new TerminalExpression_Minus() );            // ...            else                        parseTree.add( new TerminalExpression_Number(Integer.valueOf(token)) );        }    }     public int evaluate() {        Stack<Integer> context = new Stack<Integer>();         for (Expression e : parseTree) e.interpret(context);        return context.pop();    }} class InterpreterExample {    public static void main(String[] args) {        String expression = "42 4 2 - +";        Parser p = new Parser(expression);        System.out.println("'" + expression +"' equals " + p.evaluate());    }}